如何从Web.Api控制器方法发送cookie

use*_*080 18 c# cookies asp.net-web-api

我有一个Web.Api服务,它有一个接受自定义类并返回另一个自定义类的方法:

public class TestController : ApiController
{
    public CustomResponse Post([FromBody]CustomRequest request)
    {
        // process request
        ...
        // create response
        CustomResponse resp = new CustomResponse() { ... };
        return resp;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想发回一个cookie作为Http响应的一部分.我怎样才能做到这一点?

use*_*080 29

我设法通过组合来自几个不同地点的信息来做到这一点.首先,为了能够轻松地在响应中发送cookie,Web.Api控制器应该返回System.Net.Http.HttpResponseMessage类的实例(链接):

public class TestController : ApiController
{
    public HttpResponseMessage Post([FromBody]CustomRequest request)
    {
        var resp = new HttpResponseMessage();
        ...

        //create and set cookie in response
        var cookie = new CookieHeaderValue("customCookie", "cookieVal");
        cookie.Expires = DateTimeOffset.Now.AddDays(1);
        cookie.Domain = Request.RequestUri.Host;
        cookie.Path = "/";
        resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });

        return resp;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我如何确保我可以轻松地发回CustomResponse

诀窍在于回答这个问题.Request.CreateResponse<T>在请求对象上使用该方法.整个交易变为:

public class TestController : ApiController
{
    public HttpResponseMessage Post([FromBody]CustomRequest request)
    {
        // process request
        ...

        var resp = Request.CreateResponse<CustomResponse>(
            HttpStatusCode.OK,
            new CustomResponse() { ... }
        );

        //create and set cookie in response
        var cookie = new CookieHeaderValue("customCookie", "cookieVal");
        cookie.Expires = DateTimeOffset.Now.AddDays(1);
        cookie.Domain = Request.RequestUri.Host;
        cookie.Path = "/";
        resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });

        return resp;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我看到这个之前,我一直在“哇,这个 web api 的东西太棒了”。你不能只添加一个 cookie 而不必返回 HttpResponseMessage 真是太遗憾了。我认为这个想法是让 Web API 比 WCF 更容易。恐怕我没有看到。动作过滤器如何在不增加如此简单需求的复杂性的情况下提供帮助。不要明白。 (2认同)