[ASP.NET]HttpCookieCollection to CookieCollection的最簡單方法


System.Web.HttpCookieCollection 是 System.Web.HttpContext.Current.Request.Cookies 與 System.Web.Mvc.Controller.Controller.Cookies 的類型,用於獲取客戶端瀏覽器傳遞過來的 cookie。

System.Net.CookieCollection 是 System.Net.HttpWebRequest.CookieContainer 中用到的,用於發起 WebRequest 請求時帶上 cookie 。

問題場景

在當前的 ASP.NET MVC 程序中將瀏覽器發過來的 cookie 原封不動地發給后台一個提供服務的站點。以前的做法是在這個 ASP.NET MVC 程序中從 cookie 中讀取數據,然后以此數據為參數通過 WCF 調用后台服務。這次我們打算棄用 WCF,直接用 HttpWebRequest 基於簡單靈活的 HTTP 來處理。

於是就面臨如何傳遞 cookie 的問題。首先想到的是 HttpWebRequest.CookieContainer,但 CookieContainer 需要的是 CookieCollection,我們在 MVC 程序中通過 Request.Cookies 得到的卻是 HttpCookieCollection 。然后,問題就變成了如何將 HttpCookieCollection 轉換為 CookieCollection ?

解決過程

在 stackoverflow 上找到了一個解決方法(Sending cookies using HttpCookieCollection and CookieContainer):

HttpCookieCollection oCookies = Request.Cookies;
for ( int j = 0; j < oCookies.Count; j++ ) 
{
    HttpCookie oCookie = oCookies.Get( j );
    Cookie oC = new Cookie();

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
    oC.Domain   = myRequest.RequestUri.Host;
    oC.Expires  = oCookie.Expires;
    oC.Name     = oCookie.Name;
    oC.Path     = oCookie.Path;
    oC.Secure   = oCookie.Secure;
    oC.Value    = oCookie.Value;

    myRequest.CookieContainer.Add( oC );
}

但是這個繁瑣的解決方法看着別扭,用着難受。如果就這樣解決問題,一點成就感都沒有。哪是享受代碼,分明是做一天碼農,湊合一天代碼。

好的解決方法總是簡單的、優雅的,一定有更好的解決方法。抱着這樣的信念上下求索,在園子里發現一篇簡短的博文(HttpWebRequest 和 Cookie 的一些記錄),其中的一段代碼讓人眼前一亮:

HttpWebRequest.Headers.Add("Cookie", "Cookie的值");

cookie 不就是 http header 中的一段字符串嗎?從 這個 http header 中讀取出來,放到另一個 http header 中不就行了嗎?根本用不到 HttpCookieCollection 與 CookieCollection。

解決方法

直接上代碼:

var request = WebRequest.Create("http://ws.cnblogs.com/user/hasblog") as HttpWebRequest;
request.Headers.Add("Cookie", Request.Headers["Cookie"]);
using (var response = request.GetResponse() as HttpWebResponse)
{
} 

HttpCookieCollection to CookieCollection 的最簡單方法就是既不用 HttpCookieCollection,也不用 CookieCollection。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM