如何在 WCF 中反序列化自定义 SOAP 标头?

2024-06-29

我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头。我发现这篇精彩的文章 http://blogs.msdn.com/b/mohamedg/archive/2012/10/21/adding-custom-soap-headers-in-wcf.aspx关于如何做到这一点。我的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);
    }
}

这篇文章做了一件事not说的是如何read服务器上的值。根据这个帖子 https://stackoverflow.com/questions/18877591/how-to-read-http-request-headers-in-a-wcf-web-service, 您可以使用OperationContext.Current.IncomingMessageHeaders读取这些标题。当我看到这些的时候MessageHeaders在调试器下,我看到 3 个标头,其中包括我的自定义标头。因此,它肯定会出现在 SOAP 数据中。然而,当我打电话时GetHeader:

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

Then test.OperatorName一片空白。基本上,我只是返回一个空的OperatorNameMessageHeader尚未从 SOAP 中的数据反序列化的对象。

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

<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>

那么,服务器has数据,我就是做不到get到它。这个问题的解决办法是什么?


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

[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] and [DataMember]属性 - 没有它们,它就无法工作。不确定您是否需要实际派生MessageHeader对于你的情况,但对我来说,这对于读取自定义标头来说是不必要的。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WCF 中反序列化自定义 SOAP 标头? 的相关文章

随机推荐

  • Gradle 警告:不推荐使用variant.getOutputFile() 和variant.setOutputFile()

    我在 Android 应用程序项目中使用以下简化配置 android compileSdkVersion 20 buildToolsVersion 20 0 0 defaultConfig minSdkVersion 8 targetSdk
  • 为什么CasperJS表单提交不重定向到下一页?

    这是我的第一次 casper 测试 所以我仍在基础知识上挣扎 我想在登录表单上填写用户名和密码 然后提交 然后确认是否在页面上呈现 注销 链接next页面 确认用户已登录 但据我所知 当then被调用 url还是一样 看起来没有发生任何帖子
  • 防病毒程序如何检测病毒? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 防病毒程序如何检测某物是否是病毒或木马 我来自土耳其 请尽可能保持简单的英语 谢谢 查找病毒有三种基本方法 您可以扫描文件以查看其中是否包
  • JSF 多个视图限制

    我创建了一个 Web 应用程序 可以在主页上的 iFrame 内打开页面 每个 iFrame 都可以通过页面上的选项卡查看 并使用 JSF2 2 和 Mojarra 视图状态 bean 来填充页面 当我打开 10 个选项卡以下的内容时 效果
  • 识别文本中的多个类别和相关情感

    如果您有一个文本语料库 如何识别所有类别 来自预定义类别列表 以及与之相关的情绪 正面 负面写作 我将在 Python 中执行此操作 但现阶段我不一定要寻找特定于语言的解决方案 让我们用一个例子来看看这个问题 试图澄清我的问题 如果我有一整
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • bash shell 嵌套 for 循环

    我想编写一个必须在 bash shell 提示符下工作的嵌套 for 循环 在单行命令中嵌套 for 循环 例如 for i in a b do echo i done a b 在上面的例子中 for循环是在单行命令中执行的 像这样 我在
  • 将 gtk.DrawingArea 保存到文件

    我想使用 PIL 将 gtk DrawingArea 对象内容保存到 jpeg 文件 我特别想添加这个脚本 http pygstdocs berlios de pygst tutorial webcam viewer html制作照片的可能
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • Google Place API 使用限制和计费

    我开发了一款应用程序 其中使用了 Google Place API 这就是地方医生所说的关于限制的内容 Google Places API 具有以下查询限制 拥有 API 密钥的用户每 24 小时允许 1 000 个请求 通过 API 控制
  • 有没有办法在 VS Code 中自定义 JS 中导入的颜色?

    我想在之后改变这个词的颜色import在 JS 中 在 VS Code 中 我附上了我的意思的屏幕截图 截屏 我指的是红色下划线的内容 我在中没有找到有效的条目文本配合规则 https macromates com manual en la
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 错误1316。指定的帐户已存在。 Visual Studio 2017:无法安装包。返回代码 1603

    需要安装 Visual Studio for school 但遇到此错误和另一个错误 Visual Studio fails to install Microsoft Net CoreUWP version 1 1 32 and Win10
  • VBA 6:正则表达式无法识别复杂的字符串

    我有这个字符串 1X214X942 0SX 其中每个 X 代表一个 不间断空格 准确地说是空白 ASCII 代码为 160 S 代表一个空格字符 我试图用这个正则表达式来识别它 d 1 3 s d 3 s d 3 d 1 3 d 1 3 d
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 过滤给定范围内的坐标

    我有数百个带有地理位置的 out 文件 我将把它们批量导入到 SQLite 数据库中 但是 为了节省时间 我只会导入地理坐标在某些间隔内的线 文件是这样的 value value longitude latitude value value
  • AVAssetWriter 不适用于音频

    我正在尝试让音频与 iOS 应用程序的视频一起使用 视频很好 文件中没有录制任何音频 我的 iPhone 扬声器可以工作 这是初始化设置 session AVCaptureSession alloc init menu gt session
  • 构建wheel失败/“错误:INCLUDE环境变量为空”

    我正在使用 Python 2 7 11 并尝试 pip install 模块 但是其中一些模块失败了 我收到的消息是 无法为 X 构建轮子 和 错误 包含环境变量为空 我尝试安装 Scrapy LXML 和 Twisted 但都失败了 我尝
  • 在管道中使用“tee”时,如何将标准错误写入文件?

    我知道如何使用tee写入输出 标准输出 https en wikipedia org wiki Standard streams Standard output 28stdout 29 of aaa sh to bbb out 同时仍然在终
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers