代码之家  ›  专栏  ›  技术社区  ›  Jason Coyne

如何在WCF中获取自定义soap头的值

  •  6
  • Jason Coyne  · 技术社区  · 14 年前

    我已经创建了一个自定义soap头,并通过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作为索引,尽管我已经在watch窗口中确认了名称和命名空间的值是正确的。

    3 回复  |  直到 13 年前
        1
  •  6
  •   Jason Coyne    14 年前
    request.Headers.FindHeader("Auth", "xWow");
    request.Headers.GetHeader<AuthHeader>(index);
    
        2
  •  4
  •   Steven    7 年前
    HttpRequestMessageProperty requestProperty = 
        (HttpRequestMessageProperty)OperationContext.Current
            .IncomingMessageProperties[HttpRequestMessageProperty.Name];
    
    string contextToken = requestProperty.Headers["MyCustomHeader"];
    
        3
  •  1
  •   Carlos Galan    11 年前