【问题标题】:Customising HTTP header in calls to ASMX service在对 ASMX 服务的调用中自定义 HTTP 标头
【发布时间】:2020-05-21 04:00:07
【问题描述】:

我正在尝试在对 ASMX 服务的调用中添加 HTTP 标头。

Some SO posts 谈论 SOAP 标头,这不是我想要的,因为这涉及向 POST 消息的正文添加元素,即这部分:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope ...>
    <soap:Body ...>
        <q2:HeaderIn ...>

我想要添加到请求的这一部分 - HTTP 标头:

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://..."
Host: ...
Content-Length: 2018

为此,我找到了a post from 2015,它描述了添加服务引用、选择较旧的 Web 引用、然后选择代理类并覆盖 GetWebRequest。不幸的是,在Visual Studio 2017 中,选择替代代理类似乎不是一种选择。否则,这将是一个不错的选择。

问题:我是否遗漏了一些东西(很明显)导致为生成的 ASMX 服务客户端类选择代理类?

This answer to a similar question (also this one) 谈论使用OperationContextScope 将自定义标头添加到 WCF 请求。我想我可以将该服务添加为 WCF 服务并使用它。将解决方案代码从使用生成的 ASMX 客户端命名空间转换为生成的 WCF 客户端只需更改 using 语句中的命名空间 - 其他一切都相同。

不幸的是,实际上使用 WCF 客户端调用 ASMX 服务会失败,因为请求正文中生成的 XML 完全不同。

问题:我是否遗漏了一些关于在 WCF 上使用 ASMX 的内容,这会导致此问题,还是仅仅是因为它不可能? (This article 似乎表明这是可能的。)

【问题讨论】:

  • 如何调用 ASMX 服务(XML Web 服务)?我认为 WCF 客户端和客户端代理对象之间没有区别。它是发起 Http 请求的对象。只要我们向代理对象添加一个 Http 标头,它就应该可以工作。在我这边,我通过添加服务引用(不是 Web 引用)来调用 ASMX 服务,随后使用 WebOperationContext ,它是您上述解决方案的便捷包装器,最后得到正确的 HTTP 标头。
  • 奇怪的是,生成的服务引用客户端不会产生与 Web 引用客户端相同的请求正文。但是,我确实有一个解决方案,它不涉及替换客户端类 - 请参阅下面的帖子。

标签: c# wcf visual-studio-2017 http-headers asmx


【解决方案1】:

找到this post,它指出应使用单独文件中的部分类来覆盖GetWebRequest() 并插入自定义标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2017-11-11
    相关资源
    最近更新 更多