Vous permet d'ajouter des cookies pour ihttpactionResult dans les contrôleurs WebAPI.
Contenu
Il existe plusieurs façons d'ajouter des cookies à la réponse dans WebAPI. La manière recommandée, selon les documents, consiste à utiliser la méthode d'extension resp.Headers.AddCookies(cookies) , mais il existe des inconvénients:
= char dans une valeur cookie.CookieHeaderValue prend en charge les paires de valeurs de nom et ces collections seront présentées comme cookie-name=key1=value1&key2=value2 , mais la collection sera encodée si vous essayez de le définir via simplement passer une chaîne. Passer directement les chaînes de collecte de cookies est utile pour les cas lorsque vous passez des valeurs de cookies à travers les services, par exemple l'intégration avec les API basées sur les cookies héritées. Une autre façon consiste à définir des cookies sur httpResponse.cookies via HttpContext (vérification de l'exemple), mais il y a encore plus d'inconvénients:
HttpContext dans WebAPI est une mauvaise pratique, car vous ne pouvez pas les obtenir dans l'auto-hôte.new Thread() . Mieux vaut avoir une API simple pour IHttpActionResult w / o décrit les inconvénients. Aussi bon d'avoir un support localhost ou "activer ces cookies pour tous les sous-domaines" hors de la boîte.
Vous pouvez installer Aspnet.webapi.cookiespasshrough package via Nuget.
var cookieDescriptors = new [ ]
{
// simple cookie with Path=/
new CookieDescriptor ( "test-cookie" , "1" ) ,
// encode
new CookieDescriptor ( "test-cookie2" , "2=" ) {
CodeStatus = CookieCodeStatus . Encode
} ,
// expires, secure, httponly + decode
new CookieDescriptor ( "test-cookie3" , "a%3D3" ) {
Secure = true ,
CodeStatus = CookieCodeStatus . Decode ,
HttpOnly = true ,
Expires = new DateTime ( 2118 , 1 , 1 )
} ,
// path will be added and no decode or encode
new CookieDescriptor ( "test-cookie4" , "4%3D=" ) {
Path = "/subfolder/"
} ,
} ;
// also you can use Request.GetReferrerHost() to get referrer's host which is useful when you're developing AJAX API
return Ok ( ) . AddCookies ( cookieDescriptors , Request . GetRequestHost ( ) ) ;Vous pouvez activer les cookies pour tous les sous-domaines:
// domain will be ".example.org"
return Ok ( ) . AddCookies ( cookieDescriptors , "example.org" ) . EnableCookiesForAllSubdomains ( ) ;
// same, domain will be ".example.org"
return Ok ( ) . AddCookiesForAllSubdomains ( cookieDescriptors , "www.example.org" ) ;
// or even this
return Ok ( )
. AddCookiesForAllSubdomains ( cookieDescriptorsForAllSubdomains , "example.org" )
. AddCookies ( cookieDescriptorsForOneDomain , "example.com" )
. AddCookies ( cookieDescriptorsForAnotherDomainAndAllSubdomains , "www.example.net" )
. EnableCookiesForAllSubdomains ( ) ; Les navigateurs ont des problèmes avec les cookies locaux. Si vous spécifiez le domaine comme localhost ou même .localhost , il ne sera pas du tout ajouté à la réponse pour faire des cookies avec localhost qui fonctionne pour presque tous les navigateurs.
Lorsque vous appelez .EnableCookiesForAllSubdomains() ou utilisez .AddCookiesForAllSubdomains(...) La convertion de domaine suivante sera appliquée:
"localhost" => " "
" . localhost " => " "
"www.localhost" => ".www.localhost"
"www.localhost.ru" => ".localhost.ru"
"www.org" => ".www.org"
".www.org" => ".www.org"
"example.org" => ".example.org"
"www.example.org" => ".example.org"
".www.example.org" => ".www.example.org" Vérifiez AspNet.WebApi.CookiesPassthrough.Example Project.