使用odata和web api时创建cookie 2

时间:2014-06-10 07:40:28

标签: c# asp.net asp.net-web-api odata asp.net-web-api2

如何在使用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);
}

2 个答案:

答案 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