我正在尝试将项目从.NET迁移到.NET Core。在.NET中,我最初使用了WCF WSHttpBinding服务,但无法在.NET Core中使用相同的服务。我尝试在客户端使用BasicHttpBinding连接到WsHttpBinding,但是它会抛出一个错误,说明绑定应在客户端和服务器端匹配。请建议如何在不修改客户端WSHttpBindings的情况下,在.NET Core上实现WSHttpBinding。
我能够使用自定义绑定使其正常工作。还有可以配置的https、文本和二进制绑定元素。
var binding = new CustomBinding
{
Elements = { new HttpTransportBindingElement //or HttpsTransportBindingElement for https:
{
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue
}}
};
我在完整框架上使用了WSHttpBinding。迁移到.net core 2.2后,我遇到了相同的问题。
后来我发现BasicHttpsBinding(它是https,而不是http)完全符合我的需求。我只需用BasicHttpsBinding替换WSHttpBinding,一切都正常工作(在Windows和Linux上都可以)。
BasicHttpBinding
和Ntlm
凭据类型(DOMAIN\Username):public async Task<string> ImportSalesOrder(string jsonString)
{
var binding = new BasicHttpsBinding();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
var endpoint = new EndpointAddress(_appConfig["endpoint"]);
var client = new eCommIntegrationMgt_PortClient(binding, endpoint);
client.ClientCredentials.UserName.UserName = _appConfig["usernam"];
client.ClientCredentials.UserName.Password = _appConfig["password"];
try
{
var result = await client.ImportSalesOrderAsync(jsonString);
return result.return_value;
}
catch (Exception)
{
throw;
}
}
_appConfig
是一个全局变量,可以通过 DI(依赖注入)获得。如果您不使用 DI,可以将其替换为硬编码的值。这里的 catch
是多余的,但您可以添加自定义的错误处理/日志记录。
eCommIntegrationMgt_PortClient
是客户端,即包含所有终端的服务对象。
var binding = GetCustomBinding();
private Binding GetCustomBinding()
{
CustomBinding result = new CustomBinding();
TextMessageEncodingBindingElement textBindingElement = new TextMessageEncodingBindingElement();
result.Elements.Add(textBindingElement);
HttpsTransportBindingElement httpsBindingElement = new HttpsTransportBindingElement
{
AllowCookies = true,
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
AuthenticationScheme = System.Net.AuthenticationSchemes.Negotiate
};
result.Elements.Add(httpsBindingElement);
return result;
}
.Net Core目前还不支持WsHttpBinding。 您可以尝试使用以下方法。 https://www.nuget.org/packages/WsSecurityCore/
您可以将响应作为XmlNodeList或Xml完整字符串获取,并使用XmlSerializer将其转换为响应类。