WCF 错误 SOAP 1.2 消息在仅使用 wsHttpBinding 发送到 SOAP 1.1 时无效
WCF Error A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only using wsHttpBinding
我正在尝试使用我无法控制的服务,并且只获得了要使用的 WSDL。该服务需要证书进行身份验证。我的证书配置很好,当我尝试调用服务时出现错误,如下所示:
The content type text/xml;charset=UTF-8 of the response message does
not match the content type of the binding (application/soap+xml;
charset=utf-8). If using a custom encoder, be sure that the
IsContentTypeSupported method is implemented properly. The first 274
bytes of the response were: 'soap:VersionMismatchA SOAP 1.2 message is not valid when sent to a SOAP 1.1 only
endpoint.'.
我已经尝试过不同的方法,比如使用 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>
这些配置是通过添加服务引用自动生成的吗?我们可以使用服务的WSDL文件生成服务端使用的绑定信息,添加服务引用生成客户端代理class.
此外,如果使用传输安全模式的服务使用证书对客户端进行身份验证,请保证满足以下要求。
- 客户端和服务器端之间的信任关系
应该成立。在本地 CA 中安装相互证书。
- WCF 应用程序应访问这两个证书。
请添加 Everyone 帐户(或帐户 运行 WCF
申请)到证书私钥的管理组。
- 两个证书都应该有客户端身份验证
目的和服务器身份验证的预期目的。
如果有什么我可以帮忙的,请随时告诉我。
我已经设法通过调整和试验弄明白了。为了解决这个问题,我更改为 basicHttpsBinding,这又花了我一两天的时间来确定默认传输 clientCredentialType 是 None 并且您需要配置自定义绑定,如下所示。我希望 WCF 能告诉您原因或针对您遇到的错误提供解决方案,因为这太痛苦了。从一个错误描述到下一个不停。
<bindings>
<basicHttpsBinding>
<binding name="SecureHubBinding">
<security>
<transport clientCredentialType="Certificate" />
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>
我正在尝试使用我无法控制的服务,并且只获得了要使用的 WSDL。该服务需要证书进行身份验证。我的证书配置很好,当我尝试调用服务时出现错误,如下所示:
The content type text/xml;charset=UTF-8 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 274 bytes of the response were: 'soap:VersionMismatchA SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint.'.
我已经尝试过不同的方法,比如使用 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>
这些配置是通过添加服务引用自动生成的吗?我们可以使用服务的WSDL文件生成服务端使用的绑定信息,添加服务引用生成客户端代理class.
此外,如果使用传输安全模式的服务使用证书对客户端进行身份验证,请保证满足以下要求。
- 客户端和服务器端之间的信任关系 应该成立。在本地 CA 中安装相互证书。
- WCF 应用程序应访问这两个证书。 请添加 Everyone 帐户(或帐户 运行 WCF 申请)到证书私钥的管理组。
- 两个证书都应该有客户端身份验证 目的和服务器身份验证的预期目的。
如果有什么我可以帮忙的,请随时告诉我。
我已经设法通过调整和试验弄明白了。为了解决这个问题,我更改为 basicHttpsBinding,这又花了我一两天的时间来确定默认传输 clientCredentialType 是 None 并且您需要配置自定义绑定,如下所示。我希望 WCF 能告诉您原因或针对您遇到的错误提供解决方案,因为这太痛苦了。从一个错误描述到下一个不停。
<bindings>
<basicHttpsBinding>
<binding name="SecureHubBinding">
<security>
<transport clientCredentialType="Certificate" />
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>