【问题标题】:Creating cookie when using odata and web api 2使用 odata 和 web api 2 时创建 cookie
【发布时间】:2014-07-30 21:21:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以编写自己的 DelegatingHandler 来将所需的 cookie 添加到响应中。

    查看“示例:在消息处理程序中设置和检索 Cookie”部分:

    http://www.asp.net/web-api/overview/working-with-http/http-cookies

    关于如何插入消息处理程序,请查看:"Per-Route Message Handlers"

    http://www.asp.net/web-api/overview/working-with-http/http-message-handlers

    【讨论】:

      【解决方案2】:

      如果您使用的是IHttpActionResult 类,则其中有一个函数Task&lt;System.Net.Http.HttpResponseMessage&gt; 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 的一部分(我也是新的),所以我也想以某种方式保留它。
      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2013-08-24
      • 1970-01-01
      • 2015-12-23
      • 2018-06-29
      • 2013-01-12
      相关资源
      最近更新 更多