在使用OData和Web API 2时创建cookie

3

当使用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个回答

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);
    }
}

您需要调整您的控制器代码来调用这个新类。例如:
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*/);
}

感谢您抽出时间。Created(Order)是odata库的一部分,System.Web.Http.OData.dll(对我来说还很新),所以我想保留它。 - Robert

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接