我需要使用https-asmx服务,通过basicHttpBinding和自定义绑定公开方法。当我使用basicHttpBinding时,我能够得到响应。然而,对于自定义绑定,我得到了以下错误。
无法理解SoapAction标头
我使用svcutil.exe生成了服务代理,并在startup.cs文件中注入了依赖项,如下所示。svcutil.exe 在代理文件中绑定
<customBinding>
<binding name="MyServicesSoap12">
<textMessageEncoding messageVersion="Soap12" />
<httpsTransport />
</binding>
</customBinding>
startup.cs 中的代码
.ConfigureServices((ctxt, service) =>
{
services.AddScoped<IMyServicesSoap12>(provider => {
//var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
var binding = new CustomBinding();
var msgVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12);
binding.Elements.Add(new TextMessageEncodingBindingElement(msgVersion, System.Text.Encoding.Default));
binding.Elements.Add(new HttpsTransportBindingElement() { AllowCookies = true, MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue });
var endPoint = new EndpointAddress("https://someservice.asmx");
var channelFactory = new ChannelFactory<IMyServicesSoap12>(binding, endPoint);
var client = channelFactory.CreateChannel();
return client;
});
}
然后,我在myLogic类中进行了IMyServicesSoap12的构造函数注入。
这是我的消费者代码。
var Response = await _myService.MethodAsync(requestVariable);
花了将近4-5个小时来寻找答案。我最初没有按照中的建议使用"添加连接的服务"选项https://joshuachini.com/2017/07/13/calling-a-soap-service-from-asp-net-core-or-net-core/
最后,我看到了当您使用AddConnectedService选项时自动生成的代码。我只缺了一件小东西。这不是总是归结为一个小小的错误吗!
设置消息版本时,我缺少AddressingVersion
的可选参数。
上一篇-
var msgVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12);
更改-
var msgVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12,AddressingVersion.None);
这为我解决了这个问题。我想在这里为其他开发者分享并节省一些时间。