(由于最近是针对一个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,如果没有配置基地址,则终结点的地址采用全地址
< 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,如果配置了基地址,则终结点的地址采用相对地址
< 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获得元数据,如下配置即可
4,一定要注意安全配置这里设置一下,否则默认会有局域网的账户验证什么的。
< netTcpBinding >
< binding name ="netTcpBindConfig" >
< security mode ="None" />
</ binding >
</ netTcpBinding >
</ bindings >
5,行为配置
代码
< serviceBehaviors >
< behavior name ="Server.ChatServiceBehavior" >
< serviceMetadata />
< serviceDebug includeExceptionDetailInFaults ="false" />
</ behavior >
</ serviceBehaviors >
</ behaviors >
</ system.serviceModel >
到这里,服务已经通过net.tcp方式建立起来了,静候silverlight客户端的调用了。
silverlight调用
silverlight以tcp方式访问服务器时,只能够访问固定的端口,需要一个策略文件验证,我们只需要将这个策略文件放到IIS下即可。
{
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,如需转载请自行联系原作者