WCF设置自定义标头 - 读取不起作用

时间:2011-08-31 11:45:40

标签: c# wcf

我需要将自定义标头放入WCF。我的守则如下:

ServiceReference1.Service2Client ws = new Service2Client();
   using (OperationContextScope scope = new OperationContextScope((IContextChannel)ws.InnerChannel))
        {
            MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders;
            messageHeadersElement.Add(MessageHeader.CreateHeader("Authorization", String.Empty, "string"));
            messageHeadersElement.Add(MessageHeader.CreateHeader("username", String.Empty, "user"));
            var res = ws.GetUser("123");
        }

但是当我尝试在服务中阅读它时,以下

中没有任何内容可用
public class OAuthAuthorizationManager : ServiceAuthorizationManager
    {
        protected override bool CheckAccessCore(OperationContext operationContext)
        {
            int index = OperationContext.Current.IncomingMessageHeaders.FindHeader("username", String.Empty);

            string auth = operationContext.IncomingMessageHeaders.GetHeader<string>("username", String.Empty);

            var hereIseeIt = operationContext.RequestContext.RequestMessage;

索引为-1:未找到

auth:还显示标头不可用的异常

hereIseeIt:.T​​oString()显示一个xml,我可以看到用户存在,但我看不到任何对象中的信息访问 enter image description here

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <username xmlns="http://Microsoft.WCF.Documentation">user</username>
  </s:Header>
  <s:Body>
    <GetUser xmlns="http://tempuri.org/">
      <UserId>123</UserId>
    </GetUser>
  </s:Body>
</s:Envelope>

但我无法访问它们,因为我发现无法访问s:Header ...

2 个答案:

答案 0 :(得分:0)

尝试使用:

XPathNavigator XPN = operationContext.RequestContext.RequestMessage.CreateBufferedCopy ().CreateNavigator ();

不优雅,但它可以通过XPathNavigator访问整个消息,这样可以轻松获取所需消息中的任何值。

一些链接:

答案 1 :(得分:0)

这是为您的方案获取username标头的内部XML的简单方法。即使你很久以前就已经解决了你的问题,我认为它可能会帮助那些面临同样问题的人。

var username = String.Empty;

// using the namespace from you XML sample
var usernameHeaderPosition = OperationContext.Current
    .IncomingMessageHeaders
    .FindHeader("username", "http://Microsoft.WCF.Documentation");

if (usernameHeaderPosition > -1)
{
    username = OperationContext.Current
        .IncomingMessageHeaders
        .GetReaderAtHeader(usernameHeaderPosition).ReadInnerXml();
}