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

  • 相关阅读:
    在powerdesigner中,一个table,怎么在diagram中创建多个symbol
    查看SQLserver编码格式的SQL语句
    永久解决火狐浏览器出现的flash版本更新问题
    列出所有表的情况
    sql查询当天,一周,一个月数据的语句
    vs2010边调试边编辑后台.cs文件的办法
    sql查询上一条记录和下一条记录
    jquery 中substring,substr,split的用法
    jQuery HTML 操作
    Win10怎么设置始终以管理员身份运行应用程序
  • 原文地址:https://www.cnblogs.com/ShadowLoki/p/2672293.html
Copyright © 2011-2022 走看看