WCF使用Header如何正确实现
创始人
2024-06-23 16:01:16
0

对于一个经验丰富的编程人员来说,它不可能不知道WCF为何物。作为一个.NET Framework 3.5的重要组成部件,为我们带来了非常大的好处。我们在这里先来了解一下WCF使用Header的相关应用技巧。

在WCF中如何实现登陆,典型的场景如下:

 

 

 

  1. [ServiceContract]  
  2. public interface ILogin {  
  3. [OperationContract]  
  4. bool Signin(string userName, string password);  
  5. }  
  6. [ServiceContract]  
  7. public interface IBizTest {  
  8. [OperationContract]  
  9. string GetWelcomeInfo();  

 

千万别从WCF自带的那个InstanceContextMode来想办法,因为WCF中的PerSession调用只是针对每个服务类而言的,除非你变态到服务端只有一个类来实现全部的接口;#t#

变个思路,能不能用类似.NET Remoting中的CallContext呢?但是查了一下WCF的手册,好像也没有这么个东西,怎么解决呢?那就是Custom header.

解决方案提出前,需要知道一点的就是,服务端取客户端送出的Header的方法:

先遍历OperationContext.Current.IncomingMessageHeaders找出客户端发送的Header Name,然后再用 OperationContext.Current.IncomingMessageHeaders.GetHeader(i)得到值就可以啦。

下面的问题就剩下客户端怎么发送Custom Header了。

策略1:在每个客户端Proxy中增加类似如下的代码

 

  1. using (OperationContextScope scope = new 
    OperationContextScope(InnerChannel)) {  
  2. MessageHeader mh = MessageHeader.CreateHeader("HeaderName", 
    string.Empty, "HeaderValue");  
  3. OperationContext.Current.OutgoingMessageHeaders.Add(mh);  
  4. //…  
  5. }  
  6.  

 

 

但是每个客户端都要增加,这样的WCF使用Header的步骤太麻烦了,所以,引出

2.自定义一个CallContextAttribute,代码如下:

1. 先定义一个IClientMessageInspector接口的实现类

  1. public class ContextHeader : IClientMessageInspector {  
  2. public void AfterReceiveReply(ref System.ServiceModel.
    Channels.Message reply, object correlationState) {  
  3. //  
  4. }  
  5. public object BeforeSendRequest(ref System.ServiceModel.
    Channels.Message request, IClientChannel channel) {  
  6. MessageHeader clientHeader = MessageHeader.CreateHeader
    ("headerName", string.Empty, "headerValue");  
  7. request.Headers.Add(clientHeader);  
  8. return null;  
  9. }  

 

 

OK , 然后就可以实现CallContextAttribute了

  1. public class CallContextAttribute : Attribute, IEndpointBehavior,
     IOperationBehavior {  
  2. IEndpointBehavior Members#region IEndpointBehavior Members  
  3. public void AddBindingParameters(ServiceEndpoint endpoint, 
    BindingParameterCollection bindingParameters) {  
  4. }  
  5. public void ApplyClientBehavior(ServiceEndpoint endpoint, 
    ClientRuntime clientRuntime) {  
  6. clientRuntime.MessageInspectors.Add(new ContextHeader());  
  7. }  
  8. public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 
    EndpointDispatcher endpointDispatcher) {  
  9. }  
  10. public void Validate(ServiceEndpoint endpoint) {  
  11. }  
  12. #endregion  
  13. IOperationBehavior Members#region IOperationBehavior Members  
  14. public void AddBindingParameters(OperationDescription operationDescription, 
    BindingParameterCollection bindingParameters) {  
  15. }  
  16. public void ApplyClientBehavior(OperationDescription operationDescription,
     ClientOperation clientOperation) {  
  17. clientOperation.Parent.MessageInspectors.Add(new ContextHeader ());  
  18. }  
  19. public void ApplyDispatchBehavior(OperationDescription operationDescription, 
    DispatchOperation dispatchOperation) {  
  20. }  
  21. public void Validate(OperationDescription operationDescription) {  
  22. }  
  23. #endregion  

 

 

完工大吉,***在我们Contract中加入CallContextAttribute就可以啦,客户端不用增加任何代码了。

  1. [ServiceContract]  
  2. [CallContext]  
  3. public interface IBizTest {  
  4. [OperationContract]  
  5. [CallContext]  
  6. string GetWelcomeInfo();  

以上就是我们为大家介绍的WCF使用Header的相关操作方法。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...