zoukankan      html  css  js  c++  java
  • 寄宿在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正常使用,这里也需要注意

  • 相关阅读:
    Java面试系列05(static、JVM内存模、final、abstract、interface)
    Java面试系列04(抽象、实例化、类、多态、对象、特殊对象、权限封装)
    第一个spring冲刺团队贡献分(80分满分)
    第二个Sprint冲刺第一天
    第一阶段的事后诸葛亮
    第一个Sprint冲刺成果
    第一个Sprint冲刺第十天
    第一个Sprint冲刺第九天
    第一个Sprint冲刺第八天
    第一个Sprint冲刺第七天
  • 原文地址:https://www.cnblogs.com/ShadowLoki/p/2672293.html
Copyright © 2011-2022 走看看