我们现有的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
对象和我的自定义绑定类(TextMessageEncodingBindingElement
,ThroughputEncoderBindingElement
,{返回的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>
答案 0 :(得分:1)
您需要在 BindingElement 上实现 IWsdlExportExtension 界面。
有了它,您可以通过实施 ExportContract 和 ExportEndpoint 函数告诉WCF如何为您的服务生成WSDL。
您可以在Microsoft的 CustomTextMesssageEncoder WCF示例中看到它是如何完成的。
请参阅:https://msdn.microsoft.com/en-us/library/ms751486(v=vs.110).aspx
下载样本,然后就可以了。