通过netTcpBinding在WCF上传递消息头

时间:2015-02-04 06:09:07

标签: asp.net wcf soap nettcpbinding

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

Web表单应用程序使用表单身份验证,因此我HttpContext.Current.User具有此使用的所有角色。所以我使用AuthCookie通过HttpRequestMessageProperty传递对象并按如下方式读取:

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

basicHttpBinding工作正常。但后来我需要实现net.tcp协议,因此HttpRequestMessageProperty不再起作用了。我试图通过MessageHeader添加它,但这也不起作用。

OperationContext.Current.IncomingMessageProperties没有我的标题......

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

 <netTcpBinding>
    <binding transactionFlow="True">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding> 

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了转移角色信息的工作方式。虽然目前还不清楚为什么标准方法对我来说不合适,但这是正确的(感谢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表示&#34;命名空间&#34;)