从 .net 核心调用 Soap 1.2 服务
Call Soap 1.2 service from .net core
我正在尝试使用 .net core 3.1 中的 SOAP 1.2 WCF 服务。
我在 .net Framework 4 中有一个客户端在工作。它使用具有安全模式 TransportWithMessageCredential 的 wsHttpBinding。
首先,我尝试在我的 .net 核心客户端中使用 wsHttpBinding,但出现“平台不受支持”的异常。所以我切换到 BasicHttpsBinding 但是当我调用函数时导致另一个异常:
ProtocolException: Content Type text/xml; charset=utf-8 was not supported by service https://domain/Service.svc. The client and service bindings may be mismatched.
根据我的发现,BasicHttpsBinding 适用于 Soap 1.1,而 wsHttpBinding 适用于 Soap 1.2。
所以我尝试根据 将 Soap-version 设置为 1.2 但这给了我另一个例外:
SocketException: An existing connection was forcibly closed by the remote host.
这是 .net 4 的工作配置(为了便于阅读而略微缩写):
<bindings>
<wsHttpBinding>
<binding name="ServiceEndpoint"
messageEncoding="Text" textEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
这是我的 .net 核心代码(不工作):
var binding = new BasicHttpsBinding();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
binding.Security.Mode = BasicHttpsSecurityMode.TransportWithMessageCredential;
// Code from
var customTransportSecurityBinding = new CustomBinding(binding);
var textBindingElement = new TextMessageEncodingBindingElement
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
// Replace text element to have Soap12 message version
customTransportSecurityBinding.Elements[1] = textBindingElement;
var serviceClient = new Svc.ServiceClient(customTransportSecurityBinding, new EndpointAddress("https://domain/Service.svc"));
serviceClient.ClientCredentials.UserName.UserName = "usr";
serviceClient.ClientCredentials.UserName.Password = "pwd";
var units = serviceClient.GetUnitsAsync().Result; // Exception here
服务器和客户端必须使用相同的绑定进行通信。你的服务器使用的是wsHttpBinding,而客户端使用的是BasicHttpsBinding,所以无法正常通信。
你是对的。 Core目前不支持wsHttpBinding,所以有两种解决方案:
1:将服务端的wsHttpBinding改为BasicHttpBinding,核心不支持Message安全模式。 Core中的WCF特性,可以参考下面的link:
https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.1.0.md
2:客户端使用的是.net framework而不是core
我建议你使用第二种方案。毕竟core对wcf的支持不好
如果问题仍然存在,请随时告诉我。
我正在尝试使用 .net core 3.1 中的 SOAP 1.2 WCF 服务。
我在 .net Framework 4 中有一个客户端在工作。它使用具有安全模式 TransportWithMessageCredential 的 wsHttpBinding。
首先,我尝试在我的 .net 核心客户端中使用 wsHttpBinding,但出现“平台不受支持”的异常。所以我切换到 BasicHttpsBinding 但是当我调用函数时导致另一个异常:
ProtocolException: Content Type text/xml; charset=utf-8 was not supported by service https://domain/Service.svc. The client and service bindings may be mismatched.
根据我的发现,BasicHttpsBinding 适用于 Soap 1.1,而 wsHttpBinding 适用于 Soap 1.2。
所以我尝试根据
SocketException: An existing connection was forcibly closed by the remote host.
这是 .net 4 的工作配置(为了便于阅读而略微缩写):
<bindings>
<wsHttpBinding>
<binding name="ServiceEndpoint"
messageEncoding="Text" textEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
这是我的 .net 核心代码(不工作):
var binding = new BasicHttpsBinding();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
binding.Security.Mode = BasicHttpsSecurityMode.TransportWithMessageCredential;
// Code from
var customTransportSecurityBinding = new CustomBinding(binding);
var textBindingElement = new TextMessageEncodingBindingElement
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
// Replace text element to have Soap12 message version
customTransportSecurityBinding.Elements[1] = textBindingElement;
var serviceClient = new Svc.ServiceClient(customTransportSecurityBinding, new EndpointAddress("https://domain/Service.svc"));
serviceClient.ClientCredentials.UserName.UserName = "usr";
serviceClient.ClientCredentials.UserName.Password = "pwd";
var units = serviceClient.GetUnitsAsync().Result; // Exception here
服务器和客户端必须使用相同的绑定进行通信。你的服务器使用的是wsHttpBinding,而客户端使用的是BasicHttpsBinding,所以无法正常通信。
你是对的。 Core目前不支持wsHttpBinding,所以有两种解决方案:
1:将服务端的wsHttpBinding改为BasicHttpBinding,核心不支持Message安全模式。 Core中的WCF特性,可以参考下面的link:
https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.1.0.md
2:客户端使用的是.net framework而不是core
我建议你使用第二种方案。毕竟core对wcf的支持不好
如果问题仍然存在,请随时告诉我。