WCF筆記(3)發送和接收SOAP(消息)頭

一、定義

消息頭是附加信息,那有啥用呢?你可別說,有時候還真有不少用處。舉個例子,WCF的身份驗證是不是很麻煩?還要頒發什麼證書的(當然不是榮譽證書),如果只是驗證一個客戶端的身份,如用戶名什麼的,那麼,在調用服務方法時,動態加入一些消息頭,到了服務器端就獲取並驗證消息頭。這樣一來,是不是也實現身份驗證?

如何傳遞消息頭?當然是客戶端發送,服務器端接收的情況較多了


二、示例代碼

1、服務器端(接收消息頭)

 /// <summary>
    /// 1、定義一個服務協定
    /// </summary>
    [ServiceContract(Name="MyService")]
    public interface IService
    {        
        [OperationContract]
        string TestMethod();
        [OperationContract (Name="SecondMethod")]
        int Add(int a, int b);
        [OperationContract]
        string GetMessageHeader();
        [OperationContract]
        Employee GetEmployee();
    }

/// <summary>
    ///2、定義一個類並實現服務協定
    /// </summary>
    public class MyService : IService
    {
        public string TestMethod()
        {
            return "這是一個測試方法";
        }
        public int Add(int a, int b)
        {
            return a + b;
        }
        /// <summary>
        /// 獲取客戶端發送的消息頭
        /// </summary>
        /// <returns>返回消息頭</returns>
        public string GetMessageHeader()
        {
            int index= OperationContext.Current.IncomingMessageHeaders.FindHeader("header", "http://my");
            if (index != -1)
            {
                return OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index);
            }
            return "";
        }

        public Employee GetEmployee()
        {
            return new Employee
            {
                Name = "張三",
                Age = 28,
                City = "北京"
            };
        }
    }

 //3、在Main入口點中定義服務器相關的參數,並啓動服務。
        static void Main(string[] args)
        {
            Uri baseUri = new Uri("http://localhost:8000/Service");
            using(ServiceHost serverHost=new ServiceHost(typeof(MyService),baseUri))
            {
                //向服務器添終結點
                WSHttpBinding httpBinding = new WSHttpBinding();
                //這裏不需要安全驗證
                httpBinding.Security.Mode = SecurityMode.None;
                serverHost.AddServiceEndpoint(typeof(IService), httpBinding, "my");
                //爲了能讓VS生成客戶端代碼,即WSDL文檔,故要添加以下行爲  
                ServiceMetadataBehavior mdBehavior = new ServiceMetadataBehavior
                {
                   HttpGetEnabled=true
                };
                serverHost.Description.Behaviors.Add(mdBehavior);

                //如果服務順利啓動,則提示,處理Opened事件  
                serverHost.Opened += (sender, e) => Console.WriteLine("服務已啓動");

                //啓動服務
                try
                {
                    serverHost.Open();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                // 爲了讓程序不往下執行而結束,故加上這句  
                Console.ReadKey();
                // 關閉服務器  
                serverHost.Close();  
            }
        }        
    }


2、客戶端(發送消息頭)

  WS.MyServiceClient myClient = new WS.MyServiceClient();
            //在客戶端發送消息頭
            using (OperationContextScope scope = new OperationContextScope(myClient.InnerChannel))
            {
                MessageHeader myHeader = MessageHeader.CreateHeader("header", "http://my", "你好,這是消息頭");
                OperationContext.Current.OutgoingMessageHeaders.Add(myHeader);
                //調用方法獲取消息頭
                string messHeader = myClient.GetMessageHeader();
                Console.WriteLine(messHeader);
                Console.WriteLine("服務方法已調用");
            }           


發佈了88 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章