Vorrei creare un servizio di accesso demo in web api e ho bisogno di impostare un cookie sulla risposta. Come lo faccio? O c'è un modo migliore per fare l'autorizzazione?Come si imposta un cookie di risposta su HttpReponseMessage?
risposta
Aggiungere un riferimento alla System.Net.Http.Formatting.dll
e utilizzare il metodo AddCookies
estensione definito nella classe HttpResponseHeadersExtensions
.
Qui è a blog post describing this approach e MSDN topic.
Se quell'assemblea non è un'opzione per voi, ecco la mia risposta Più da prima che questo era un'opzione:
più vecchio risposta segue
Io preferisco un approccio che rimane nel regno della HttpResponseMessage
senza sanguinamento nel HttpContext che non è così unità testabili e non sempre si applica a seconda dell'ospite:
/// <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());
}
Quindi è possibile includere un cookie nella risposta In questo modo:
HttpResponseMessage response;
response.Headers.SetCookie(new Cookie("name", "value"));
Sono d'accordo, questo sembra un'alternativa migliore. Modificate le risposte accettate per guidare gli utenti in futuro. –
È possibile che questa non sia più una risposta? L'unico modo in cui ho trovato questa dll è tramite Nuget e afferma esplicitamente che è per WebApi.Client superiore a 2.0 e inferiore a 2.1, quindi questa risposta era per WebApi 2. Ora siamo con ASP.NET 4 e I non riesci a trovare più questa DLL –
@IsaacLlopis Suppongo che l'abbiano spostato dall'estensione dll al core. –
È possibile aggiungere il cookie alla raccolta HttpContext.Current.Response.Cookies.
var cookie = new HttpCookie("MyCookie", DateTime.Now.ToLongTimeString());
HttpContext.Current.Response.Cookies.Add(cookie);
Grazie, esattamente quello che volevo e avrei dovuto pensare a me stesso. Ma in realtà ci si aspettava che fosse disponibile su "HttpResponseMessage". –
Questa è stata la mia prima ipotesi, ma per qualche motivo non lo è. Certamente sarebbe stato meglio per la capacità di test. – Maurice
Questa risposta va contro il modo in cui WebAPI dovrebbe essere utilizzato. Non si dovrebbe fare riferimento a HttpContext.Current da WebAPI poiché questo non esiste se si esegue l'hosting automatico. I beta bit mancavano di un sacco di utility helper come questa. Il RC ha aggiunto un metodo di estensione AddCookies() a HttpResponseMessage.Headers che dovresti invece usare. – Andrew
Non sembra possibile impostare un cookie su HttpResponseMessage. Dai un'occhiata a questo thread, forse aiuterà http://stackoverflow.com/questions/5463431/setting-cookies-within-a-wcf-service –