Добавьте собственный заголовок SOAP в PowerShell, используя New-WebServiceProxy

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

Как аналогичным образом добавить настраиваемый заголовок исходящего SOAP-сообщения при вызове методов на прокси-сервере, сгенерированном командлетом New-WebServiceProxy PowerShell?

Изменить: Чтобы уточнить, я могу сделать те же вызовы в PowerShell, что я показываю в C# выше, но OperationContext.Current всегда нулевой. Я обошел это в C#, создав OperationContextScope, но для этого требуется внутренний канал прокси-сервера веб-службы, который, по-видимому, не обеспечивает прокси PowerShell.

1 ответ

Решение

Ваш код C# использует класс OperationContext из WCF. Командлет New-WebServiceProxy в PowerShell не использует 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, скорее всего, будет включать использование встроенного C# через параметр TypeDefinition командлета Add-Type.

Другие вопросы по тегам