且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务

更新时间:2022-05-26 04:39:03

(由于最近是针对一个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,如果没有配置基地址,则终结点的地址采用全地址  
  
 

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务代码
<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,如果配置了基地址,则终结点的地址采用相对地址

 

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务代码
<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,行为配置 

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务代码

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

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

silverlight调用

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

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务代码
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"}); 
        }

 Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务

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




     本文转自wengyuli 51CTO博客,原文链接:http://blog.51cto.com/wengyuli/587227,如需转载请自行联系原作者