Sono riuscito a farlo combinando le informazioni da alcune posizioni diverse. In primo luogo, in modo da essere facilmente in grado di inviare i cookie nella risposta, il controller Web.Api deve restituire un'istanza della classe System.Net.Http.HttpResponseMessage
(link):
public class TestController : ApiController
{
public HttpResponseMessage Post([FromBody]CustomRequest request)
{
var resp = new HttpResponseMessage();
...
//create and set cookie in response
var cookie = new CookieHeaderValue("customCookie", "cookieVal");
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = Request.RequestUri.Host;
cookie.Path = "/";
resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return resp;
}
}
Ma allora come faccio a fare in modo che posso facilmente INOLTRE restituire il CustomResponse
?
Il trucco è nel answer in questo question. Utilizzare il metodo Request.CreateResponse<T>
sull'oggetto richiesta. L'intera faccenda diventa allora:
public class TestController : ApiController
{
public HttpResponseMessage Post([FromBody]CustomRequest request)
{
// process request
...
var resp = Request.CreateResponse<CustomResponse>(
HttpStatusCode.OK,
new CustomResponse() { ... }
);
//create and set cookie in response
var cookie = new CookieHeaderValue("customCookie", "cookieVal");
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = Request.RequestUri.Host;
cookie.Path = "/";
resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return resp;
}
}
Questo sembra giusto. Se lo fai con molti metodi di azione, puoi inserirlo in un filtro azione. –
Sono stato tutto "wow questa fantastica roba di questo web api" fino a quando non l'ho visto. Che peccato non si può semplicemente aggiungere un cookie senza dover restituire un messaggio HttpResponseMessage. Ho pensato che l'idea fosse di rendere l'API Web più semplice di WCF. Ho paura di non vederlo. Come può un filtro di azione aiutare qui senza aggiungere ancora più complessità a un requisito così semplice. Non capirlo – ianbeks
Scusa se posso chiedere, sono un po 'confuso. Devo prendere il cookie di risposta nel client e impostarlo, oppure il browser che ottiene l'intestazione di risposta del set-cookie dovrebbe farlo automaticamente? –