Reputation: 9166
I have a Web.Api service which has a method that accepts a custom class and returns another custom class:
public class TestController : ApiController
{
public CustomResponse Post([FromBody]CustomRequest request)
{
// process request
...
// create response
CustomResponse resp = new CustomResponse() { ... };
return resp;
}
}
Now I want to also send a cookie back as part of the Http response. How can I do that?
Upvotes: 25
Views: 37694
Reputation: 138776
With recent versions of Web API, async
, and IHttpActionResult
, we can now simply do this:
public async Task<IHttpActionResult> MyMethod(... myParameters ...)
{
...
var cookie = new CookieHeaderValue("myCookie", "myValue");
...
var resp = new HttpResponseMessage();
resp.StatusCode = HttpStatusCode.OK;
resp.Headers.AddCookies(new[] { cookie });
return ResponseMessage(resp);
}
Upvotes: 4
Reputation: 9166
I managed to do this by combining information from a few different locations. First, in order to easily be able to send cookies in the response, the Web.Api controller should return an instance of the System.Net.Http.HttpResponseMessage
class (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;
}
}
But then how do I make sure that I can easily ALSO send back the CustomResponse
?
The trick is in the answer to this question. Use the Request.CreateResponse<T>
method on the request object. The whole deal then becomes:
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;
}
}
Upvotes: 36