一、定義
消息頭是附加信息,那有啥用呢?你可別說,有時候還真有不少用處。舉個例子,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("服務方法已調用");
}