Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用odata和web api 2时创建cookie_C#_Asp.net_Asp.net Web Api_Odata_Asp.net Web Api2 - Fatal编程技术网

C# 使用odata和web api 2时创建cookie

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

使用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);
}
公共异步任务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(我也是新创建的)的一部分,所以我也想以某种方式保留它。