none
WCF能否客户端和服务端两边的协议和地址有差异啊? RRS feed

  • 问题

  • Hi

    有问题要请教,我这边有一个系统部署在内网,用的是httpTransport,并且地址也是http://的,正常操作什么的都没问题。

    但是客户防火墙会只允许外网用户通过HTTPS对内部进行访问,并且会自动做外网HTTPS到内网HTTP的转换。

    这样就导致我在外网的Client端的配置必须使用httpsTransport+https://, 否则就没法访问

    但是由于内网只能是http的,所以内网服务的配置是httpTransport+http://,目前的情况是完全无法访问,通过Fiddler监控,发现通过外网使用Get方法能看到这个wcf services产生的scv文件的网页,但是实际调用的时候使用post方法就404了

    先请问一下能不能通过修改配置的方法解决啊?WCF允许客户端和服务端使用的地址有差异么?


    具体配置如下,内网服务和外网客户端就在httpsTransport  和 https://的地方有区别

         <customBinding>

            <binding name="HJLite_Server_CustomBinding" closeTimeout="01:00:00"
              openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00">
              <binaryMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647"
                maxSessionSize="2147483647" compressionFormat="GZip" />
              <httpsTransport maxBufferPoolSize="524288000" maxReceivedMessageSize="2147483647"
                maxBufferSize="2147483647" />
            </binding>
          </customBinding>
        </bindings>
        <services>
          <service name = "HJLite.Server.WcfService.RegisterImplementWCF" behaviorConfiguration = "" >
            <endpoint address = "https://www.xxx.xxx.com/Server/Implement/RegisterImplementWCF.svc" binding = "customBinding" bindingConfiguration = "HJLite_Server_CustomBinding" contract = "HJLite.Server.WcfService.IRegisterInterfaceWCF" />
          </service>

        </services>

    2017年5月10日 10:17

答案

  • 找到答案了

    services 实现类加[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

    结贴给分

    • 已标记为答案 asuras 2017年5月17日 6:29
    2017年5月17日 6:29

全部回复

  • 外网client配置httpsTransport + https,内网server配置httpTransport + http,、

    返回结果是

    The message with To 'https://test.wmslite.damco.com/wcf_test_external_http/connectiontest.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.  Check that the sender and receiver's EndpointAddresses agree.

    外网client配置httpsTransport + https,内网server配置httpsTransport + https,

    返回的结果是

    无法激活请求的服务“https://test.wmslite.damco.com/wcf_test_external_http/connectiontest.svc”。有关详细信息,请参见服务器的诊断跟踪日志。

    我估计是内网的IIS不能开启https导致的。

    2017年5月10日 10:37
  • 你分享的配置文件是客户端的还是服务端?根据services的节点,我判断是服务端的,根据你的描述,服务端只能用http协议,那为什么endpoint的地址用的是https

    在服务端,是不是不需要https security?如果是这样,我建议你试试下面的步骤。

    1.        服务端用http binding http 协议
    2.        客户端用https bindinghttps协议请求
    3.        在服务端IIS配置里面,SSL Settings 不要勾选Require SSL.

    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年5月11日 2:57
    版主
  • 上面写的配置是客户端的,因为客户端是通过外网访问,必须用到HTTPS

    服务端由于在内网,不需要用HTTPS访问,所以用httpTransport+http://就可以了,两边的config文件几乎一样,就是差一个s而已。

    如您所说

    1.        服务端用http binding http 协议,是的
    2.        客户端用https bindinghttps协议请求,是的
    3.        在服务端IIS配置里面,SSL Settings 不要勾选Require SSL,是的

    但是仍旧无法访问

    我想咨询一下,WCF里允许客户端使用连接A,服务端使用连接B来申明各自的EndpointAddress么?

    2017年5月11日 5:53
  • WCF 的客户端和服务器应该都能使用HTTP HTTPS 只是因为你的防火墙阻止的HTTP HTTPS 只是transport加密, 如果你的防火墙支持将HTTPS 转化为HTTP请求,那就不影响你的WCF 请求。

    先排除是否是你防火墙的问题,我建议你放一个index.html文件在你的WCF IIS 里面,看能否从外面通过HTTPS 正常访问。

    另外,你是怎么生成你的客户端代码和配置文件的?services 这个节点不应该出现在客户端的配置文件里面,客户端应该是client的节点。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年5月12日 5:21
    版主
  • 其他非WCF的站点都是工作正常的,只有WCF无法工作

    我现在的情况是Server的web.config里配置的是http://XXXXXXXXX,但是Client的config里配置的是https://xxxxxxxxxx,虽然防火墙能把client的https://xxxxxxxx请求转换成http://xxxxxxxx,但是服务端仍旧会抛出一个“Check that the sender and receiver's EndpointAddresss agree”的错误,我的理解是要求客户端配置的URL必须和服务端URL完全一致,所以来请教一下是否有可能两者地址不一致也能工作啊?

    PS:Client那边是用代码建立的binding,在内网的HTTP和HTTPS环境下都能工作的。

    2017年5月12日 9:44
  • 根据我的理解是可以的。

    >>其他非WCF的站点都是工作正常的,只有WCF无法工作

    你是否测试了,如果在WCF 站点下放一个html页面,HTTPS 是否能够访问?

    绕过公司的防火墙,如果你在部署WCF 服务的电脑上用相同的客户端代码,是否还会报错?

    另外,我看到你是用的自定义的Binding, 我建议你新建一个空的WCF服务,什么都不改变,然后部署到IIS之后再测试下新的服务是否还有相同的错误。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年5月15日 5:20
    版主
  • 您好,

    (你是否测试了,如果在WCF 站点下放一个html页面,HTTPS 是否能够访问?)
    我试过,aspx页面,外网能够正常操作这个页面的

    另外,您说的endpointaddress不同,我测试过,的确是可以的,并且我的理解是URL不同没关系,只要两侧协议一样就行了。
    但是!!!如果某一侧配置的httpTransport,则WCF会强制要求URL中使用HTTP,而不能使用HTTPS,这样的话就会强迫URL不一致了

    有什么办法能忽略URL的前半部分么?

    2017年5月15日 8:35
  • >>endpointaddress不同,我测试过,的确是可以的,

    这句话是什么意思?你是怎么测试的?你是不是在内网里,用client端的代码进行了测试?

    >>如果某一侧配置的httpTransport,则WCF会强制要求URL中使用HTTP,而不能使用HTTPS,这样的话就会强迫URL不一致了

    只要你的WCF 接受HTTP 和HTTPS 就可以。HTTPS只是对Transport进行了加密而已, 我觉得并不会对你的服务有影响。

    对于新建一个空的WCF Service,是否会出现相同的问题?


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年5月16日 2:48
    版主
  • 找到答案了

    services 实现类加[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

    结贴给分

    • 已标记为答案 asuras 2017年5月17日 6:29
    2017年5月17日 6:29