你的分享就是我们的动力 ---﹥

Silverlight与WCF之间的通信(4)

时间:2011-09-30 10:05来源:www.chengxuyuans.com 点击:

silverlight以net.tcp方式调用console上寄宿的wcf服务

(由于最近是针对一个demo进行的研究,在之前公开过代码结构,这里只是对需要改动的地方加以说 明)WCF4.0使得编写wcf服务不再那么复杂,去掉了许多的配置信息,客户端只需要一个服务地址,便可 在系统生成的代理类下做开发了,在部署时也只需要更改引用配置文件的地址即可。但是今天我尝试 silverlight以net.tcp方式连接host到console上的wcf服务时,却颇费周折,一个wcf console server 和一个console client 之间的通信很简单,不需要任何配置,但是silverlight如果想引用这个服务,则 必须为服务定义元数据才能供silverlight生成代理类,如果直接用之前的服务,会产生错误。

WCF服务端配置

这个是简单的服务,没有任何配置,本次我是想完全由配置文件来解决信息公开的问题,所以服务端 实际上很简单

host = new ServiceHost(typeof(ChatService));
host.Open();

在silverlight引用时会出现找不到元数据的情况,原因是没有公开服务的描述信息,没有元数据无法 让外界知道服务的信息,所以经过反复的试验后终于能够正常访问到服务,配置文件有两种情况:

1,如果没有配置基地址,则终结点的地址采用全地址

<system.serviceModel>
    <services>
      <service behaviorConfiguration="Server.ChatServiceBehavior" 

name="Server.ChatService">
        <endpoint address="net.tcp://localhost:4503/ChatService" 

binding="netTcpBinding" 

contract="Server.IChatService"></endpoint>
        <endpoint address="net.tcp://localhost:4503/ChatService/mex" 

binding="mexTcpBinding" contract="IMetadataExchange" 

></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Server.ChatServiceBehavior">
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
      </serviceBehaviors>
    </behaviors>

2,如果配置了基地址,则终结点的地址采用相对地址

<system.serviceModel>
    <services>
      <service behaviorConfiguration="Server.ChatServiceBehavior" 

name="Server.ChatService">
        <endpoint address="" binding="netTcpBinding" 

contract="Server.IChatService"></endpoint>
        <endpoint address="mex" binding="mexTcpBinding" 

contract="IMetadataExchange" ></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:4503/ChatService/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

3,其实,也可以通过HTTP获得元数据,如下配置即可

<endpoint address="http://localhost:4503/ChatService/mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>

4,一定要注意安全配置这里设置一下,否则默认会有局域网的账户验证什么的。

<bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>

5,行为配置

<behaviors>
      <serviceBehaviors>
        <behavior name="Server.ChatServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

到这里,服务已经通过net.tcp方式建立起来了,静候silverlight客户端的调用了。

silverlight调用

silverlight以tcp方式访问服务器时,只能够访问固定的端口,需要一个策略文件验证,我们只需要 将这个策略文件放到IIS下即可。

void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            ChatService.ChatServiceClient proxy = new ChatService.ChatServiceClient();
            proxy.SendMessageCompleted += (o,ev) => {
                string str = string.Empty;
                if (ev.Error == null)
                {
                    str = "发送成功";
                }
                else
                {
                    str = "发送失败";
                }
                MessageBox.Show(str);
            };
            proxy.SendMessageAsync(new ChatService.MessageInfo() { 

Message="hello,leon", UserName="mac", PartnerName="leon"});
        }

注意,一定要将策略文件放到IIS下面。

随文源码

转载注明地址:http://www.chengxuyuans.com/slverlight/19415.html