WCF错误仅使用wsHttpBinding将SOAP 1.2消息发送到SOAP 1.1时,该消息无效



我正在尝试使用一个我无法控制的服务,并且只得到了要使用的WSDL。该服务需要证书进行身份验证。我的证书配置很好,当我尝试调用以下服务时,我遇到了一个错误:

内容类型text/xml;charset=响应消息的UTF-8与绑定的内容类型不匹配(application/soap+xml;charset=utf-8(。如果使用自定义编码器,请确保IsContentTypeSupported方法实现正确。第一个274响应的字节数为:"soap:VersionMismatchSOAP 1.2消息在仅发送到soap 1.1时无效端点。'。

我尝试过不同的方法,比如使用customBinding,但我遇到了更多的错误,我觉得无论如何都不会得到。你能帮忙吗?

客户端配置:

<system.serviceModel>
<client>
<endpoint name="IDeliveryServiceImplPort" 
address="WebServiceUrl" 
binding="wsHttpBinding" 
bindingConfiguration="wsHttpBinding"
behaviorConfiguration="wsHttpCertificateBehavior"
contract="IDeliveryService">
<identity>
<dns value="MyIdentity" />
</identity>
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8"
useDefaultWebProxy="true" allowCookies="false">
<readerQuotas
maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<reliableSession enabled="false" ordered="true" inactivityTimeout="00:10:00" />
<security mode="Transport">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
<customBinding>
<binding name="WsHttpSoap11"  closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00">
<textMessageEncoding messageVersion="Soap11WSAddressing10" />
<security authenticationMode="MutualCertificate" />
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="wsHttpCertificateBehavior">
<clientCredentials>
<clientCertificate x509FindType="FindBySubjectName" findValue="MyIdentity" storeLocation="LocalMachine" storeName="My" />
<serviceCertificate>
<defaultCertificate x509FindType="FindBySubjectName" findValue="MyIdentity" storeLocation="LocalMachine" storeName="My" />
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>

我已经设法通过调整和试用来解决这个问题。为了解决这个问题,我改为basicHttpsBinding,这花了我一两天的时间才弄清楚默认的传输客户端CredentialType是None,你需要配置一个自定义绑定,如下所示。我希望WCF能告诉你为什么,或者给你一个错误的解决方案,因为这是一种痛苦。从一个错误描述到下一个不间断的错误描述。

<bindings>
<basicHttpsBinding>
<binding name="SecureHubBinding">
<security>
<transport clientCredentialType="Certificate"  />
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>

这些配置是通过添加服务引用自动生成的吗?我们可以使用服务的WSDL文件来生成服务器端使用的绑定信息,并添加服务引用来生成客户端代理类
此外,如果具有传输安全模式的服务使用证书对客户端进行身份验证,请保证满足以下要求。

  1. 客户端和服务器端之间的信任关系应该建立。在本地CA中安装相互证书
  2. WCF应用程序应该访问这两个证书。请添加Everyone帐户(或运行WCF的帐户应用程序(到证书私钥的管理组
  3. 两个证书都应该具有预期的客户端身份验证目的和服务器身份验证的预期目的

如果有什么我可以帮忙的,请随时告诉我。

最新更新