使用自定义绑定从WCF端点返回WSDL的SOAP版本与配置不匹配

时间:2014-12-12 22:54:03

标签: c# web-services soap wsdl

我们现有的WCF端点当前使用basicHttpBinding和一个端点的默认SOAP 1.1绑定。它由我们控制的.NET Compact Framework 3.5客户端应用程序调用。我们需要一些自定义日志记录,包括请求和响应的线路上的字节数。为此,我正在开发一个自定义的MessageEncoder和IDispatchMessageInspector,并在配置中使用相关的自定义绑定。这一切都运行良好,客户端能够使用在我进行更改之前生成的代理类无问题地调用端点。我遇到的问题是,当我尝试使用NetCFSvcUtil.exe重新生成代理类时,它失败了,因为WSDL说端点正在使用SOAP 1.2。

  

错误:.NET Compact Framework不支持此服务提供的任何绑定。

     

CustomBinding_IAssetService:.NET Compact Framework不支持绑定元素选项TextMessageEncodingBindingElement.MessageVersion = Soap12(http://www.w3.org/2003/05/soap-envelope)AddressingNone(http://schemas.microsoft.com/ws/2005/05/addressing/none)。

因此,我使用浏览器查看WSDL,并使用SOAP 1.2报告端点。

为我的自定义绑定生成的WSDL:

<wsdl:binding name="CustomBinding_IAssetService" type="tns:IAssetService">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>

使用旧绑定生成的WSDL:

<wsdl:binding name="BasicHttpBinding_IAssetService" type="tns:IAssetService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>

有趣的是,如果我使用<textMessageEncoding messageVersion="Soap11">元素替换自定义绑定配置中的自定义编码器,则WSDL包含预期的SOAP 1.1绑定:

<wsdl:binding name="CustomBinding_IAssetService" type="tns:IAssetService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>

这让我相信这是我自定义课程中的一个问题。我调试了代码,以查看从内部MessageVersion对象和我的自定义绑定类(TextMessageEncodingBindingElementThroughputEncoderBindingElement,{返回的ThroughputEncoderExtensionElement的值。在发出WSDL请求的所有情况下,{1}}和ThroughputEncoderFactory)以及它的SOAP 1.1。

我的代码或配置中是否有任何问题?还有什么我可以尝试的吗?

原始绑定

ThroughputEncoder

原始配置服务

<basicHttpBinding>
    <binding name="HttpBinding" maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2147483647" ... />
    </binding>
</basicHttpBinding>

新绑定

<service name="Company.AssetService" behaviorConfiguration="DefaultServiceBehavior">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8000/Asset/service"/>
        </baseAddresses>
    </host>
    <endpoint address=""
              binding="wsHttpBinding"
              bindingConfiguration="WsBinding"
              contract="Company.IAssetService" />
    <endpoint address="basic"
              binding="basicHttpBinding"
              bindingConfiguration="HttpBinding"
              contract="Company.IAssetService" />
</service>

新的服务配置

<customBinding>
    <binding name="throughputEncoding" maxReceivedMessageSize="2147483647">
      <throughputEncoding>
        <textEncoding messageVersion="Soap11">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" ... />
        </textEncoding>
      </throughputEncoding>
      <httpTransport/>
    </binding>
</customBinding>

扩展配置

<service name="Company.AssetService" behaviorConfiguration="DefaultServiceBehavior">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8000/Asset/service"/>
        </baseAddresses>
    </host>
    <endpoint address=""
              binding="wsHttpBinding"
              bindingConfiguration="WsBinding"
              contract="Company.IAssetService" />
    <endpoint address="basic"
              binding="customBinding"
              bindingConfiguration="throughputEncoding"
              contract="Company.IAssetService" />
</service>

<extensions>
    ...
  <bindingElementExtensions>
    <add name="throughputEncoding"
         type="Company.Infrastructure.ThroughputEncoderExtensionElement, Company, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </bindingElementExtensions>
</extensions>

1 个答案:

答案 0 :(得分:1)

您需要在 BindingElement 上实现 IWsdlExportExtension 界面。

有了它,您可以通过实施 ExportContract ExportEndpoint 函数告诉WCF如何为您的服务生成WSDL。

您可以在Microsoft的 CustomTextMesssageEncoder WCF示例中看到它是如何完成的。

请参阅:https://msdn.microsoft.com/en-us/library/ms751486(v=vs.110).aspx

下载样本,然后就可以了。