微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从.NET Core调用Soap 1.2服务

如何解决从.NET Core调用Soap 1.2服务

我正在尝试从.net core 3.1使用SOAP 1.2 WCF服务。
我在.net framework 4中有一个客户端正在工作。它使用具有安全模式TransportWithMessageCredential的wsHttpBinding。

首先,我尝试在.net核心客户端中使用wsHttpBinding,但出现了“不支持平台”异常。因此我切换到BasicHttpsBinding,但是在调用函数时导致另一个异常:

ProtocolException:内容类型text / xml;服务https://domain/Service.svc不支持charset = utf-8。客户端和服务的绑定可能不匹配。

从我发现BasicHttpsBinding适用于Soap 1.1,而wsHttpBinding适用于Soap 1.2。
因此,我尝试根据https://stackoverflow.com/a/53336689将Soap-version设置为1.2,但这给了我另一个例外:

SocketException:现有连接被远程主机强行关闭

这是.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 https://stackoverflow.com/a/53336689
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,因此它们无法正常通信。

enter image description here

您是对的。 Core当前不支持wsHttpBinding,因此有两种解决方案:

1:将服务器的wsHttpBinding更改为BasicHttpBinding,并且核心不支持消息安全性模式。有关Core中的WCF功能,您可以参考以下链接:

https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.1.0.md

2:客户端使用.net框架而不是核心。

我建议您使用第二种解决方案。毕竟,核心对wcf的支持不好。

如果问题仍然存在,请随时告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。