如何将从DispatchMessageInspector中的邮件头获取的信息传递给ServiceContract?

时间:2012-06-26 10:09:30

标签: asp.net-mvc wcf wcf-endpoint servicebehavior

我正在尝试将用户信息从控制器传递到服务层。

IClientMessageInspectorsIDispatchMessageInspectors似乎是最有可能的解决方案。

完成Building an HTTP User Agent Message InspectorWriting a WCF Message Inspector后,我对如何将信息添加到邮件标头以及如何阅读它有了一个很好的想法。

我无法弄清楚的是:

  

如何在IClientMessageInspector

中获取用户信息      

在控制器内我常常起诉User.Identity.Name。但是用户   对象在消息检查器中不可用。一种方法来实现这一点   消息检查器中的信息将传递给它   构造函数,但我从不显式创建MessageInspector对象   那么如何在其构造函数中传递用户信息。

     

编辑:我找到了第一个问题的答案。用户信息可以通过获取   System.Threading.Thread.CurrentPrincipal.Identity.Name。仍然卡住了   第二部分。

如何在服务方法中提供用户信息?

我可以浏览标题并从DispatchMessageInspector中的邮件标题中获取用户信息,但是如何在我的某个操作合同中提供此信息?

1 个答案:

答案 0 :(得分:0)

使用与用户信息相关的属性创建类。使用此方法在标头中覆盖对象BeforeSendRequest(ref Message request, IClientChannel channel);方法设置值 - MessageHeader _messageHeader = MessageHeader.CreateHeader();并将使用信息类的对象放入。

// Summary:
//     Creates a new message header with the specified data.
//
// Parameters:
//   name:
//     The local name of the header XML element.
//
//   ns:
//     The namespace URI of the header XML element.
//
//   value:
//     The content of the header to be created.
//
// Returns:
//     A System.ServiceModel.Channels.MessageHeader.
public static MessageHeader CreateHeader(string name, string ns, object value); 

在服务方面得到它 - MessageHeaders类方法 -

// Summary:
//     Finds a message header in this collection by the specified LocalName and
//     namespace URI of the header element.
//
// Parameters:
//   name:
//     The LocalName of the header XML element.
//
//   ns:
//     The namespace URI of the header XML element.
//
// Type parameters:
//   T:
//     The message header.
//
// Returns:
//     A message header.
public T GetHeader<T>(string name, string ns);