2011-01-21 30 views
2

在C#中,我可以做到以下几点:添加自定义SOAP头在PowerShell中使用新WebServiceProxy

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命令行生成的代理上的方法时定制传出SOAP消息头?

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

+0

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

+0

请通过此说明更新您的问题。 –

+0

仅供参考我结束了使用代理的CookieContainer设置cookie来传递我需要的信息。从Jason的回答看来,我的最初目标可能是可能的,但有些牵扯。如果我有它再做一次,我可能会去使用svcutil生成的WCF代理。 – dcstraw

回答

4

您的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#。

+0

感谢您的澄清和建议。我开始认为最好的方法可能是调用svcutil来创建一个WCF服务代理,然后加载生成的程序集。不过,对于我所问的问题,你的回答似乎很好。 – dcstraw

+0

通常使用'[SoapHeader]'属性来发送自定义的SOAP标头。但是,我不知道在这种情况下是否可以使用它。 –

相关问题