Silverlight与WCF之间的通信(4)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下面。




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




相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
76 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
113 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
142 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
|
网络协议 安全 Windows
WCF如何绑定netTcpBinding寄宿到控制台应用程序详解
新建一个WCF服务类库项目,在其中添加两个WCF服务:GameService,PlayerService
WCF如何绑定netTcpBinding寄宿到控制台应用程序详解
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
894 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1098 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1038 0
|
网络架构
(纯代码)快速创建wcf rest 服务
因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding 2.
1017 0
下一篇
DataWorks