寄宿在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协议的跨域文件

clientaccesspolicy.xml
<?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正常使用,这里也需要注意

原文地址:https://www.cnblogs.com/ShadowLoki/p/2672293.html