在REST WCF中使用HTTP Header進(jìn)行數(shù)據(jù)交互
我們知道,在HTTP協(xié)議的報文頭Header中存放著許多信息。如果你讀過老A的《通過添加HTTP Header實現(xiàn)上下文數(shù)據(jù)在WCF的自動傳遞》,那你一定知道如何通過底層的擴(kuò)展來實現(xiàn)如何在REST WCF中使用HTTP Header來進(jìn)行數(shù)據(jù)交互。這對于大家更多的了解WCF的底層機(jī)制有很大的幫助作用。
竊以為:在實際的REST WC應(yīng)用中,想通過Header頭來實現(xiàn)數(shù)據(jù)交互不用那么麻煩。MicroSoft在它所提供的庫中就已經(jīng)為我們封裝好了一些接口,可以很容易的讓我們實現(xiàn)這一功能。
HTTP Header報文頭可以在Server與Client之間傳遞很多數(shù)據(jù)。我們可以獲取這些數(shù)據(jù)然后進(jìn)行相應(yīng)的操作。如:根據(jù)Server可以根據(jù)Client發(fā)送過來的Header信息判斷Client是否合法等這些非業(yè)務(wù)邏輯的操作。下面就簡單介紹如何使用現(xiàn)有的庫在Client與REST WCF服務(wù)中實現(xiàn)HTTP Header數(shù)據(jù)交互。
在WebClient、HttpWebRequest中也有Header的接口函數(shù),來操作Header。如下圖:
本文以使用HttpClient類為例進(jìn)行說明。
1、將Header信息添加到Http請求之中:
HttpClient client = new HttpClient();
client.DefaultHeaders.Add("clientName", "ClientA");
2、服務(wù)端獲取Header頭信息。
我們知道在REST WCF中,我們是通過WebOperationContext.Current獲取當(dāng)前的上下文操作的。通過Reflector看看WebOperationContext:
它里面的IncomingRequest、IncomingResponse、OutgoingRequest、OutgoingResponse就有是Client發(fā)送過來的請求信息,或者Server發(fā)回給Client的輸出請求、相應(yīng)信息。如下圖:

圖1

圖2
我們可以通過他們來獲取HTTP中的Header信息。
如上圖,通過IncomingRequest、IncomingResponse、OutgoingRequest、OutgoingResponse獲取到的Header類型都是WebHeaderCollection集合。遍歷結(jié)合,我們便能獲取到Header中的各種信息了。
獲取Header信息的方法:
WebHeaderCollection headerCollection = WebOperationContext.Current.IncomingRequest.Headers;
foreach (string item in headerCollection)
{
string value = headerCollection.Get(item);
}
在REST服務(wù)中,我們能獲取到Header信息,如下圖:

這樣,我們便能通過獲取到key來獲取對應(yīng)的value信息作出相應(yīng)的處理了。
后記:獲取Header信息后進(jìn)而進(jìn)行相關(guān)業(yè)務(wù)邏輯操作。這符合AOP的思想。但是在我熟悉的AOP框架Spring.Net、Unity中,都是獲取到注入對象然后調(diào)用相應(yīng)的方法時進(jìn)行攔截。類似在REST 服務(wù)中,通過模擬HTTP請求的方式來訪問相應(yīng)的接口,沒有找到一種途徑來實現(xiàn)AOP。望有經(jīng)驗的朋友能給個建議。謝謝!
代碼和上節(jié)一樣,知識在相應(yīng)的操作時候加上Header信息、獲取Header信息。這里就不重復(fù)給出了。
浙公網(wǎng)安備 33010602011771號