延续之前的风格。。。。一切从简,达到目的最重要
使用netTcpBinding的WCF双工服务这里不赘述了……
我们先来看看如何能让netTcpBinding的服务可以被Http-GET发现
<behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <netTcpBinding> <binding portSharingEnabled="true"> <security mode="None"></security> </binding> </netTcpBinding> </bindings> <services> <service name="Server.CalcService"> <endpoint address="" binding="netTcpBinding" contract="Contracts.ICalcService"></endpoint> <!--<host> <baseAddresses> <add baseAddress="net.tcp://172.26.2.5:4534"/> <add baseAddress="http://172.26.2.5:8000"/> </baseAddresses> </host>--> </service> </services>
我们看上边这段Config。
写过WCF服务的都知道,如果想要服务可以通过Http-Get发现,需要满足下面这点 就是服务的行为Behavior 需要配置httpGetEnabled=true
但是咱们的服务现在是基于TCP/IP的,这么整肯定不行,怎么办呢?对Binding进行特殊的配置。 配置 binding的 portSharingEnabled=true
如果服务是寄宿于WAS的,以上配置已然足够了,但是如果是自托管的,还有提供两个BaseAddress 一个是http的 用于公开WSDL,另一个是net.tcp地址
如果启用portSharingEnabled之后,出现异常,需要注意2点,1、如果是自托管,请确认程序具有管理员权限 2、如果报异常,请在系统服务中找到Net.TCP Port Sharing Service 这个服务,并启动。
这样服务就可以通过Http-Get查询到了。
效果图如下
添加服务之后,我们来观察它生成的ServiceReferences.ClientConfig文件
这里我们看到 生成的地址是net.tcp的。 置于为什么是customBinding,这个 是因为Silverlight除了对basicHttpBinding的支持。对其他Binding都视为CustomBinding
服务引用完毕,我们来看看跨域问题。
Silverlight在请求远程服务的时候,需要先去服务所在域的根目录下载跨域文件。
通常的做法,是把跨域文件放在网站的根目录。然而我们的服务 是通过共享端口实现的引用。而这个端口共享,是将我们的Tcp/IP所用的端口绑定在Http的默认端口,也就是80端口上。因此我们的跨域文件,在Silverlight请求服务的时候,会去80端口查找,而非服务暴露出的http端口。
因此,我们需要在占用80端口的网站下,放上我们的跨域文件
这里贴上tcp协议的跨域文件

<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <socket-resource port="4502-4534" protocol="tcp" /> </grant-to> </policy> </cross-domain-access> </access-policy>
为了提高说服力,我们用fiddler监控整个Silverlight请求的过程。
看到了么?在我使用Silverlight调用服务的时候,他去我的IP:80端口下查询了跨域文件。
Silverlight查询跨域文件会扫描以下几个地方
域名:如果存在域名,会在域名的根目录下扫描
IP:如果域名下没有,会通过服务寄宿主机的IP:port方式进行查找 IPV6和V4各一遍
如果都没有,则会提示没有权限访问远程服务。
另外需要注意的是,Silverlight在使用Tcp协议时,端口的选择是有限制的,需要在4502-4534范围内的端口,才可以被Silverlight正常使用,这里也需要注意