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

C# WCF设置自定义标头-读取不起作用,c#,wcf,C#,Wcf,我需要将自定义头放入WCF。我的代码如下: ServiceReference1.Service2Client ws = new Service2Client(); using (OperationContextScope scope = new OperationContextScope((IContextChannel)ws.InnerChannel)) { MessageHeaders messageHeadersElement = Operat

我需要将自定义头放入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;
公共类OAuthAuthorizationManager:ServiceAuthorizationManager
{
受保护的覆盖布尔CheckAccessCore(OperationContext OperationContext)
{
int index=OperationContext.Current.IncomingMessageHeaders.FindHeader(“用户名”,String.Empty);
string auth=operationContext.IncomingMessageHeaders.GetHeader(“用户名”,string.Empty);
var hereiseit=operationContext.RequestContext.RequestMessage;
索引为-1:未找到

auth:也显示了一个异常,即标头不可用

HereiseIT:.ToString()显示了一个xml,我可以在其中看到用户存在,但我看不到在任何对象中访问该信息的方法


用户
123
但是我无法访问它们,因为我找不到访问s:Header的方法…

请尝试使用:

XPathNavigator XPN = operationContext.RequestContext.RequestMessage.CreateBufferedCopy ().CreateNavigator ();
虽然不优雅,但它通过
XPathNavigator
为您提供了可访问的整个消息,这将使您能够轻松获取所需消息中的任何值

一些链接:


这里有一个简单的方法,可以为您的场景获取
用户名
标题的内部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();
}

尝试使用一些自定义XML命名空间,而不是
String.Empty
作为
Add
FindHeader
的第二个参数,将“String.Empty”更改为“http://Microsoft.WCF.Documentation”,但我仍然无法访问标题
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();
}