2012-03-20 95 views
15

我想在web api中創建一個演示登錄服務,並且需要在響應中設置一個cookie。我怎麼做?或者有沒有更好的方法來進行授權?如何在HttpReponseMessage上設置響應cookie?

+0

它看起來不像你可以在HttpResponseMessage上設置cookie。看看這個線程,也許它會幫助http://stackoverflow.com/questions/5463431/setting-cookies-within-a-wcf-service – 2012-03-20 19:37:15

回答

22

添加參考System.Net.Http.Formatting.dll,並使用在HttpResponseHeadersExtensions類中定義的AddCookies擴展方法。

這裏是a blog post describing this approachMSDN topic

如果該程序集是不適合你的選擇,這是我從在此之前舊的答案是選項:

年長的答案如下

我喜歡的HttpResponseMessage領域內保持這種做法無出血到這是不一樣單元測試,並根據宿主並不總是適用的HttpContext:

/// <summary> 
/// Adds a Set-Cookie HTTP header for the specified cookie. 
/// WARNING: support for cookie properties is currently VERY LIMITED. 
/// </summary> 
internal static void SetCookie(this HttpResponseHeaders headers, Cookie cookie) { 
    Requires.NotNull(headers, "headers"); 
    Requires.NotNull(cookie, "cookie"); 

    var cookieBuilder = new StringBuilder(HttpUtility.UrlEncode(cookie.Name) + "=" + HttpUtility.UrlEncode(cookie.Value)); 
    if (cookie.HttpOnly) { 
     cookieBuilder.Append("; HttpOnly"); 
    } 

    if (cookie.Secure) { 
     cookieBuilder.Append("; Secure"); 
    } 

    headers.Add("Set-Cookie", cookieBuilder.ToString()); 
} 

然後你就可以在響應中包含一個cookie像這樣:

HttpResponseMessage response; 
response.Headers.SetCookie(new Cookie("name", "value")); 
+0

我同意,這看起來像一個更好的選擇。更改了接受的答案,以指導用戶未來。 – 2013-01-14 06:49:57

+0

這可能不再是答案嗎?我發現這個DLL的唯一方法是通過Nuget,它明確指出它是爲WebApi.Client高於2.0,低於2.1,所以這個答案是WebApi 2.我們現在與ASP.NET 4和I無法找到這個dll了。 – 2013-09-24 14:28:44

+0

@IsaacLlopis我想他們把它從擴展DLL移到了核心。 – 2014-06-12 20:10:38

6

您可以將Cookie添加到HttpContext.Current.Response.Cookies集合。

var cookie = new HttpCookie("MyCookie", DateTime.Now.ToLongTimeString()); 
    HttpContext.Current.Response.Cookies.Add(cookie); 
+0

謝謝,正是我想要的,應該想到我自己。但實際上預計可以通過'HttpResponseMessage'獲得。 – 2012-03-20 20:08:34

+0

這是我的第一個猜測,但由於某種原因,它不是。對於測試能力來說,這肯定會更好。 – Maurice 2012-03-20 20:13:54

+21

這個答案違背了WebAPI的使用方式。您不應該從WebAPI引用HttpContext.Current,因爲如果您是自主主機,則它不會存在。測試位缺少像這樣的輔助工具的負載。 RC將AddCookies()擴展方法添加到您應該使用的HttpResponseMessage.Headers中。 – Andrew 2012-07-09 09:04:16