寄宿在WAS中的WCF服务被Silverlight消费时的跨域问题 及 TcpNetBinding的服务如何使用HttpGet获取WSDL
延续之前的风格。。。。一切从简,达到目的最重要
使用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正常使用,这里也需要注意
posted on 2012-09-05 17:52 Manon_Loki 阅读(990) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架