C# 使用odata和web api 2时创建cookie
使用Web api 2和odata时如何设置cookie。我是这个api的新手,传统上我使用的是context.Response,但它在这里似乎不可用 这是我的控制器代码的一部分:C# 使用odata和web api 2时创建cookie,c#,asp.net,asp.net-web-api,odata,asp.net-web-api2,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.Ord
public async Task<IHttpActionResult> Post(Order Order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
context.Orders.Add(Order);
await context.SaveChangesAsync();
return Created(Order);
}
公共异步任务Post(订单)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
context.Orders.Add(订单);
wait context.saveChangesSync();
已创建退货(订单);
}
如果您使用的是IHttpActionResult
类,则其中有一个函数任务执行同步(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);
}
}
公共类OrderResult:IHttpActionResult
{
订单(u订单),;
HttpRequestMessage\u请求;
public OrderResult(订单、HttpRequestMessage请求)
{
_顺序=价值;
_请求=请求;
}
公共任务执行同步(CancellationToken CancellationToken)
{
var response=newhttpresponsemessage()
{
内容=新的StringContent(_值),
RequestMessage=\u请求
};
var cookie=新的CookieHeaderValue(“会话id”,“6789”);
cookie.Expires=DateTimeOffset.Now.AddDays(1);
cookie.Domain=Request.RequestUri.Host;
AddCookies(新的CookieHeaderValue[]{cookie});
返回Task.FromResult(响应);
}
}
您需要调整控制器代码来调用这个新类。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*/);
}
公共异步任务Post(订单)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
context.Orders.Add(订单);
wait context.saveChangesSync();
返回新的OrderResult(Order,request/*不确定如何在此范围内获得请求*/);
}
您可以编写自己的DelegatingHandler,将所需的cookie添加到响应中
检查“示例:在消息处理程序中设置和检索cookie”部分:
有关如何插入消息处理程序,请选中此选项:“每路由消息处理程序”
感谢您抽出时间。Created(Order)是odata库System.Web.Http.odata.dll(我也是新创建的)的一部分,所以我也想以某种方式保留它。