Как получить значение настраиваемого мыльного заголовка в WCF - PullRequest
6 голосов
/ 15 марта 2010

Я создал собственный заголовок мыла и добавил его в свое сообщение через IClientMessageInspector

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        var header = new MessageHeader<AuthHeader>();
        header.Content = new AuthHeader(Key);
        header.Actor = "Anyone";
        var header2 = header.GetUntypedHeader("Auth", "xWow");
        request.Headers.Add(header2);
        return null;
    }

    [DataContract(Name="Auth")]
    public class AuthHeader
    {
        public AuthHeader(string key)
        {
            this.Key = key;
        }

        [DataMember]
        public string Key { get; set; }
    }

У меня также есть IDispatchMessageInspector, и я могу найти правильный заголовок в списке. Тем не менее, нет никакой ценности. Я знаю, что значение прошло через провод правильно, потому что строка сообщения верна

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <Auth s:actor="Anyone" xmlns="xWow" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <Key xmlns="http://schemas.datacontract.org/2004/07/xWow.Lib">HERE IS MY KEY VALUE!!!!</Key>
        </Auth>
        <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:26443/AuthService.svc</To>
        <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IAuthService/GetPayload</Action>
    </s:Header>
    <s:Body>
        <GetPayload xmlns="http://tempuri.org/"/>
    </s:Body>
</s:Envelope>

Но, похоже, нет никакого свойства для извлечения этого значения. Класс MessageHeaderInfo имеет Actor и т. Д., Но больше ничего полезного я не могу найти.

На стороне клиента мне пришлось конвертировать заголовок в заголовок без заголовка, есть ли эквивалентная операция на сервере?

Я нашел следующее, которое должно работать.

request.Headers.FindHeader("Auth", "xWow");
request.Headers.GetHeader<AuthHeader>(index);

Если я вручную найду нужный индекс и вызову вторую строку, он будет работать как положено. Однако FindHeader возвращает -1 в качестве индекса, хотя в окне просмотра я подтвердил, что это правильные значения для имени и пространства имен.

Ответы [ 3 ]

6 голосов
/ 15 марта 2010
request.Headers.FindHeader("Auth", "xWow");
request.Headers.GetHeader<AuthHeader>(index);
4 голосов
/ 13 декабря 2011
HttpRequestMessageProperty requestProperty = 
    (HttpRequestMessageProperty)OperationContext.Current
        .IncomingMessageProperties[HttpRequestMessageProperty.Name];

string contextToken = requestProperty.Headers["MyCustomHeader"];
1 голос
/ 19 декабря 2013

Я думаю, что вам нужно добавить в качестве третьего параметра актер на функцию FindHeader

...