• 重温WCF之发送和接收SOAP头(三)


    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("服务方法已调用");
                    }
                }

    显示结果:

  • 相关阅读:
    虚拟机安装Ubuntu 18.04.1 LTS教程
    Ubuntukylin-16.04.4设置root用户自动登陆
    git 删除本地分支,远程分支,创建tag
    elementui多选后无法再选择或者取消
    git分支改名oldName改为newName
    js前端流的方式下载execl
    vue实现网页导出pdf
    vue下载图片
    js原生方法 document.execCommand实现复制
    js原生方法 document.execCommand实现复制
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3761597.html
Copyright © 2020-2023  润新知