【问题标题】:Add custom SOAP header in PowerShell using New-WebServiceProxy使用 New-WebServiceProxy 在 PowerShell 中添加自定义 SOAP 标头
【发布时间】:2011-01-21 20:44:40
【问题描述】:

在 C# 中,我可以执行以下操作:

var header = MessageHeader.CreateHeader("MyHeader", "http://mynamespace", "Header value");
OperationContext.Current.OutgoingMessageHeaders.Add(header);

这会将以下内容添加到 SOAP 消息中:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <MyHeader xmlns="http://mynamespace">Header value</MyHeader>
        ....
    </s:Header>
...

在调用由 New-WebServiceProxy PowerShell commandlet 生成的代理上的方法时,如何类似地添加自定义传出 SOAP 消息头?

编辑: 澄清一下,我可以在上面的 C# 中显示的 PowerShell 中进行相同的调用,但 OperationContext.Current 始终为空。我通过创建 OperationContextScope 在 C# 中解决了这个问题,但这需要 Web 服务代理的内部通道,而 PowerShell 的代理似乎没有提供。

【问题讨论】:

  • 澄清一下,我可以在 PowerShell 中进行与上面 C# 中显示的相同的调用,但 OperationContext.Current 始终为空。我通过创建 OperationContextScope 在 C# 中解决了这个问题,但这需要 Web 服务代理的内部通道,而 PowerShell 的代理似乎没有提供。
  • 请用此澄清更新您的问题。
  • 仅供参考,我最终使用代理的 CookieContainer 设置 cookie 来传递我需要的信息。从杰森的回答看来,我最初的目标可能是可能的,但有些涉及。如果让我重来一遍,我可能会使用 svcutil 生成的 WCF 代理。

标签: web-services soap powershell soapheader


【解决方案1】:

您的 C# 代码正在使用 WCF 中的 OperationContext 类。 PowerShell 的 New-WebServiceProxy cmdlet 不使用 WCF,而是基于 System.Web.Services.Protocols.SoapHttpClientProtocol 类创建类。

要获取 SoapHttpClientProtocol 的实例以发送自定义 SOAP 标头,请使用 SoapExtension,如下所述: http://blogs.msdn.com/b/kaevans/archive/2007/08/06/programmatically-insert-soapheader-into-soap-request-with-asmx-soapextensions.aspx

由于需要创建一个继承自 SoapExtension 的新类,将博客文章的内容移植到 PowerShell 很可能涉及通过 Add-Type cmdlet 的 TypeDefinition 参数使用嵌入式 C#。

【讨论】:

  • 感谢您的澄清和建议。我开始认为最好的方法可能是调用 svcutil 来创建 WCF 服务代理,然后加载生成的程序集。但是,对于我提出的问题,您的回答似乎很好。
  • 通常使用[SoapHeader] 属性来发送自定义SOAP 标头。但是,我不知道在这种情况下是否可以使用它。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2014-10-07
相关资源
最近更新 更多