gpt4 book ai didi

c# - 如何反序列化 WCF 中的自定义 SOAP header ?

转载 作者:太空狗 更新时间:2023-10-29 20:41:45 26 4
gpt4 key购买 nike

我正在尝试通过 WCF 向所有 SOAP 请求添加自定义 header 。我找到了 this fantastic article关于如何做到这一点。我的 MessageHeader 类如下所示:

public class OperatorNameMessageHeader : MessageHeader
{
private string opName;

public const string HeaderName = "OperatorNameMessageHeader";
public const string HeaderNamespace = "http://schemas.microsoft.com/scout";

public override string Name { get { return HeaderName; } }
public override string Namespace { get { return HeaderNamespace; } }

public string OperatorName
{
get { return opName; }
set { opName = value; }
}

public OperatorNameMessageHeader()
{
}

public OperatorNameMessageHeader(string operatorName)
{
opName = operatorName;
}

protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
{
writer.WriteElementString("OperatorName", opName);
}
}

文章没有说的一件事是如何读取服务器上的值。根据this post ,您可以使用 OperationContext.Current.IncomingMessageHeaders 来读取这些 header 。当我在调试器下查看这些 MessageHeaders 时,我看到 3 个 header ,包括我的自定义 header 。所以,它肯定会出现在 SOAP 数据中。但是,当我调用 GetHeader 时:

OperatorNameMessageHeader test = msgHeaders.GetHeader<OperatorNameMessageHeader>(OperatorNameMessageHeader.HeaderName, OperatorNameMessageHeader.HeaderNamespace);

那么 test.OperatorName 为空。基本上,我只是取回一个空的 OperatorNameMessageHeader 对象,该对象尚未从 SOAP 中的数据反序列化。

我的下一步是运行 WCF 跟踪工具。当我这样做时,我可以验证自定义 header 确实正在通过网络发送:

<MessageHeaders>
<ActivityId CorrelationId="66a7c5b6-3548-4f3c-9120-4484af76b64b" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">f9bef03b-4e7b-4e84-b327-5e79814d9933</ActivityId>
<OperatorNameMessageHeader xmlns="http://schemas.microsoft.com/scout">
<OperatorName>Correct Operator Name</OperatorName>
</OperatorNameMessageHeader>
<To d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:90/IRolesAndResourcesManager</To>
<Action d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IRolesAndResourcesManager/Authenticate</Action>
</MessageHeaders>

因此,服务器拥有数据,我只是无法获取。这个问题的解决方案是什么?

最佳答案

我遇到了完全相同的问题,并且能够按如下方式使其工作:

[DataContract(Namespace = OperatorNameMessageHeader.HeaderNamespace)]
public class OperatorNameMessageHeader
{
public const string HeaderName = "OperatorNameMessageHeader";
public const string HeaderNamespace = "http://schemas.microsoft.com/scout";

[DataMember]
public string OperatorName { get; set; }
}

有了它,我可以读取标题如下:

public static OperatorNameMessageHeader DeserializeSoap(string xml)
{
using (var reader = XmlReader.Create(new StringReader(xml)))
{
var m = System.ServiceModel.Channels.Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap11);
var operatorNameHeader = m.Headers.GetHeader<OperatorNameMessageHeader>(OperatorNameMessageHeader.HeaderName, OperatorNameMessageHeader.HeaderNamespace);

return operatorNameHeader;
}
}

请注意,我正在使用 WCF 反序列化 XML 字符串,因此需要使用 [DataContract][DataMember] 属性 - 没有它们,它不会工作。不确定您的情况是否需要从 MessageHeader 派生,但对我而言,这不是读取自定义 header 所必需的。

希望这对您有所帮助。

关于c# - 如何反序列化 WCF 中的自定义 SOAP header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389225/

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