gpt4 book ai didi

c# - 在 asp.net core 中实现 SOAP 1.2 服务

转载 作者:行者123 更新时间:2023-12-05 02:11:33 26 4
gpt4 key购买 nike

我正在尝试在 ASP.Net Core 2.2 下实现 OCPP 1.5。该标准使用 SOAP 1.2。问题来自于对 MessageHeader 属性的错误解释。带有 MessageHeader 的属性应该在 header 中,但实际上不是。

源代码:https://github.com/delianenchev/OcppDemo

我在 ASP.Net Core 下使用 SoapCore。我的初始化看起来像这样:

        var transportBinding = new HttpTransportBindingElement();
var textEncodingBinding = new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8);
var customBinding = new CustomBinding(transportBinding, textEncodingBinding);
app.UseSoapEndpoint<ISampleService>("/SOAP/service.wsdl", customBinding, SoapSerializer.DataContractSerializer);

我的演示模型具有 MessageHeaderMessageBodyMember 属性。

[MessageContract]
public class MessageModelRequest
{
[MessageHeader]
public string Id { get; set; }

[MessageBodyMember]
public string Name { get; set; }

[MessageBodyMember]
public string Email { get; set; }
}

我使用 SoapUI 测试 API。

这是我在 ASP.NET core 和 SoapCore 下的 API。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:mod="http://schemas.datacontract.org/2004/07/Models">
<soap:Header/>
<soap:Body>
<tem:TestMessageModel>
<!--Optional:-->
<tem:inputModel>
<!--Optional:-->
<mod:Email>?</mod:Email>
<!--Optional:-->
<mod:Id>1</mod:Id>
<!--Optional:-->
<mod:Name>?</mod:Name>
</tem:inputModel>
</tem:TestMessageModel>
</soap:Body>
</soap:Envelope>

为 IIS 修正了来自 WCF 项目的 API。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header>
<tem:Id>34</tem:Id>
</soapenv:Header>
<soapenv:Body>
<tem:MessageModelRequest>
<!--Optional:-->
<tem:Email>3</tem:Email>
<!--Optional:-->
<tem:Name>4</tem:Name>
</tem:MessageModelRequest>
</soapenv:Body>
</soapenv:Envelope>

最佳答案

好吧,从 SoapCore 的源代码来看,它似乎支持读取 SOAP 消息的消息 header ,因为它使用 MessageEncoder 来确切知道如何读取一条 SOAP 消息,但是在您的情况下序列化响应时 uses a native DataContractSerializer用于编写忽略您在类中拥有的任何消息协定属性的正文,而且它没有任何用于编写 header 的部分,只有消息正文。

所以我猜你需要自己在响应消息中实现 header 支持。

首先,添加IgnoreMemberAttribute(如果切换到SoapSerializer.XmlSerializer,则添加XmlIgnoreAttribute)响应消息 header ,以便数据协定序列化程序不会将它们添加到消息正文中。

最后,您需要手动找到用 MessageHeader 属性装饰的属性,并将它们添加到您的标题中。幸运的是 SoapCore 有多种选择,如 suggested here .作为替代方案,如果您计划在您的解决方案中包含 SoapCore 的源代码,您可以轻松地在 these lines 的某处实现目标。 .这样做很容易,因为在这里您可以完全控制消息和从服务方法获得的响应。借助反射,您可以轻松找到需要移动到 header 的 responseObject 的属性,并将它们转发到 responseMessage.Headers

我知道这有点讨厌,但是好吧……这就是在 .NET Core 中使用 SOAP 的代价。

关于c# - 在 asp.net core 中实现 SOAP 1.2 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57389515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com