标签:des c style class blog code
SOAP头可以理解为一种附加信息,就是附加到消息正文的内容。
既然消息头是附加信息,那有啥用呢?你可别说,有时候还真有不少用处。举个例子,WCF的身份验证是不是很麻烦?还要颁发什么证书的(当然不是荣誉证书),如果只是验证一个客户端的身份,如用户名什么的,那么,在调用服务方法时,动态加入一些消息头,到了服务器端就获取并验证消息头。这样一来,是不是也实现身份验证?
首先,实现服务器端,在OperationContract方法中通过OperationContext.Current.IncomingMessageHeaders就能得到从客户端收到的消息头了,记得引入System.ServiceModel命名空间。
class Program { [ServiceContract] public interface IService1 { [OperationContract] void HandlerHeader(); } public class Service1 : IService1 { public void HandlerHeader() { int index = OperationContext.Current.IncomingMessageHeaders.FindHeader("header", "http://www.yxl.com"); if (index != -1) { string hd = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index); Console.WriteLine("收到的标头:{0}", hd); } } } static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(Service1))) { host.AddServiceEndpoint(typeof(IService1), new WSHttpBinding(), "http://127.0.0.1:8888/service1"); ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:8888/service"); //httpGetUrl客户端引用的地址 host.Description.Behaviors.Add(behavior); host.Opened += delegate { Console.WriteLine("服务已启动"); Console.ReadKey(); }; host.Open(); } }
客户端:
using (Service1Client client = new Service1Client() ) { using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) { MessageHeader header = MessageHeader.CreateHeader("header", "http://www.yxl.com", "你好,我发消息给你了"); OperationContext.Current.OutgoingMessageHeaders.Add(header); client.HandlerHeader(); MessageBox.Show("服务方法已调用"); } }
显示结果:
重温WCF之发送和接收SOAP头(三),布布扣,bubuko.com
标签:des c style class blog code
原文地址:http://www.cnblogs.com/yxlblogs/p/3761597.html