WCF 自定义绑定 - 服务响应,客户端不响应

Posted

技术标签:

【中文标题】WCF 自定义绑定 - 服务响应,客户端不响应【英文标题】:WCF Custom binding - service responds, client doesn't 【发布时间】:2017-02-22 14:56:03 【问题描述】:

我有一个 WCF 服务,它一直在使用 wsDualHttpBinding,但我正在重写它以使用 customBinding 以获得更好的可配置性。这是我的服务绑定:

<customBinding>
    <binding name="CodeServiceBinding" openTimeout="00:01:00">
        <transactionFlow transactionProtocol="WSAtomicTransactionOctober2004"/>
        <reliableSession acknowledgementInterval="00:00:00.2" flowControlEnabled="true"
            inactivityTimeout="00:05:00" maxPendingChannels="4" maxRetryCount="8"
            maxTransferWindowSize="8" ordered="true" reliableMessagingVersion="Default" />
        <compositeDuplex/>
        <oneWay maxAcceptedChannels="10">
            <channelPoolSettings idleTimeout="00:02:00" leaseTimeout="00:10:00" maxOutboundChannelsPerEndpoint="10" />
        </oneWay>
        <textMessageEncoding messageVersion="Soap12WSAddressing10"/>
        <httpTransport allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false"
                                        decompressionEnabled="true" keepAliveEnabled="true" manualAddressing="false"
                                        maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxPendingAccepts="0"
                                        maxReceivedMessageSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                        transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                        useDefaultWebProxy="true" />
    </binding>
</customBinding>

与客户端绑定:

<system.serviceModel xdt:Transform="Replace">
    <bindings>
        <customBinding>
            <binding name="Code.DualEndPoint" openTimeout="00:00:10" sendTimeout="00:00:10">
                <transactionFlow transactionProtocol="WSAtomicTransactionOctober2004"/>
                <reliableSession inactivityTimeout="00:05:00" />
                <compositeDuplex />
                <oneWay />
                <textMessageEncoding messageVersion="Soap12WSAddressing10" />
                <httpTransport authenticationScheme="Anonymous" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://1.2.3.4/Code/Code.svc"
      binding="customBinding" bindingConfiguration="Code.DualEndPoint"
      contract="CodeProxy.ICode" name="Code.DualEndPoint" />
    </client>
</system.serviceModel>

当我针对http://localhost/Code/Code.svc 运行它时,一切都很好,但是,一旦我将客户端放在其他地方,它就不起作用了。我不认为这是防火墙问题,因为使用 wsDualHttpBinding 的旧版本可以正常工作。也因为我对其进行了wireshark。

两个版本都发送它们的 CreateSequence 请求

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</a:Action>
        <a:MessageID>urn:uuid:222d5f6a-cca4-4a4b-b8bc-3347b81b425a</a:MessageID>
        <a:ReplyTo>
            <a:Address>http://1.2.3.4:1234/CodeClient/8f191330-523a-4820-a784-46fe364aebcc</a:Address>
        </a:ReplyTo>
        <a:To s:mustUnderstand="1">http://hostname.com/Code/Code.svc</a:To>
    </s:Header>
    <s:Body>
        <CreateSequence xmlns="http://schemas.xmlsoap.org/ws/2005/02/rm">
            <AcksTo>
                <a:Address>http://1.2.3.4:1234/CodeClient/8f191330-523a-4820-a784-46fe364aebcc</a:Address>
            </AcksTo>
            <Offer>
                <Identifier>urn:uuid:f7a18edc-e79f-4d96-a90d-696d1055b592</Identifier>
            </Offer>
        </CreateSequence>
    </s:Body>
</s:Envelope>

并接收从服务接受的 HTTP 202,但新客户端永远不会发送实际的函数调用请求。旧的立即启动它,但新的绑定挂起,直到满足 SendTimeout 并引发异常。我的新绑定在等待什么导致它不发送函数调用请求,我怎样才能让它停止等待?谢谢!

【问题讨论】:

【参考方案1】:

通过在我的客户端绑定中从我的&lt;compositeDuplex/&gt; 元素中省略clientBaseAddress,我想我混淆了该服务将其响应指向何处?我不知道。无论哪种方式,它现在都在使用这个更新的节点:

<compositeDuplex clientBaseAddress="http://1.2.3.4:1234/CodeClient"/>

&lt;compositeDuplex/&gt; 在我的服务 web.config 中仍然没有属性。但是,现在我面临一个不同的问题。事实证明,以编程方式更新自定义绑定的 clientBaseAddress 非常困难。

【讨论】:

以上是关于WCF 自定义绑定 - 服务响应,客户端不响应的主要内容,如果未能解决你的问题,请参考以下文章

身份验证模式=“表单”导致WCF服务中的重定向

在 Azure 应用服务上托管 WCF 不响应客户端应用服务

接收 HTTP 响应时发生 WCF 服务错误

WCF的三种模式

学会WCF之试错法——客户端调用基础

如何从 WCF 服务返回 xml 响应