通过 netTcpBinding 在 WCF 上传递消息 headers

Pass message headers on WCF via netTcpBinding

在我头撞了一天之后,我正在寻求帮助。我在同一台机器上有一个带有 WCF 服务托管的 Web 窗体应用程序。 WCF 服务的方法具有某种自定义权限(例如,只有 "admin" 可以为用户设置密码)。

Web 表单应用程序使用表单身份验证,因此我 HttpContext.Current.User 具有此应用程序所具有的所有角色。所以我使用 AuthCookie 通过 HttpRequestMessageProperty 传递 object 并像这样阅读它:

 HttpRequestMessageProperty property =
OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;    

使用 basicHttpBinding 效果很好。但后来我需要实施 net.tcp 协议,因此 HttpRequestMessageProperty 不再起作用。我试图通过 MessageHeader 添加它,但这也不起作用。

OperationContext.Current.IncomingMessageProperties有 none 我的 headers...

那么如何将用户角色列表传递到我的 WCF?我正在像这样使用 Windows 安全性,但我需要从 HttpContext.Current.User:

传递角色
 <netTcpBinding>
    <binding transactionFlow="True">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding> 

好的,我找到了转移角色信息的工作方式。虽然还不清楚为什么标准方法对我不起作用,但这里是正确的方法(感谢 Guy Burstein):

客户:

                MessageHeader<string> header = new MessageHeader<string>(roleData);
                MessageHeader untypedHeader = header.GetUntypedHeader(ProjectParam.Role, "justASampleNamespace");
                OperationContext.Current.OutgoingMessageHeaders.Add(untypedHeader);

WCF:

string roles = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(ProjectParam.Role, "justASampleNamespace");
if(roles.Contains(ProjectParam.AdminLoginID))
{
//Now business logic comes
}

ProjectParam.Role 只是用于键的内部常量,第二个参数是示例字符串(MSDN 表示 "namespace")