如何在使用Web api 2和odata时设置cookie。我是这个api的新手,传统上我使用了context.Response,但它似乎在这里不可用。
这是我的控制器代码的一部分:
public async Task<IHttpActionResult> Post(Order Order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
context.Orders.Add(Order);
await context.SaveChangesAsync();
return Created(Order);
}
答案 0 :(得分:3)
如果您使用的是IHttpActionResult
课程,则其中有一个功能Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
您可以使用该功能返回HttpResponseMessage
并将Cookie添加到响应消息中。
我会创建另一个实现IHttpActionResult
的类,类似于:
public class OrderResult : IHttpActionResult
{
Order _order;
HttpRequestMessage _request;
public OrderResult(Order order, HttpRequestMessage request)
{
_order = value;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(_value),
RequestMessage = _request
};
var cookie = new CookieHeaderValue("session-id", "6789");
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = Request.RequestUri.Host;
response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return Task.FromResult(response);
}
}
您需要调整控制器代码才能调用此新类。 e.g。
public async Task<IHttpActionResult> Post(Order Order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
context.Orders.Add(Order);
await context.SaveChangesAsync();
return new OrderResult(Order, request /* not sure how you'll get the request in this scope*/);
}
答案 1 :(得分:1)
您可以编写自己的DelegatingHandler,将所需的cookie添加到响应中。
检查部件&#34;示例:在消息处理程序中设置和检索Cookie&#34;:
http://www.asp.net/web-api/overview/working-with-http/http-cookies
关于如何插入消息处理程序,请检查:&#34;按路由消息处理程序&#34;
http://www.asp.net/web-api/overview/working-with-http/http-message-handlers