23

カスタム クラスを受け入れ、別のカスタム クラスを返すメソッドを持つ Web.Api サービスがあります。

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

ここで、HTTP 応答の一部として Cookie も送り返したいと思います。どうやってやるの?

4

2 に答える 2

36

いくつかの異なる場所からの情報を組み合わせることで、これを行うことができました。まず、応答で Cookie を簡単に送信できるようにするために、Web.Api コントローラーはSystem.Net.Http.HttpResponseMessageクラスのインスタンス ( link )を返す必要があります。

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

しかし、どうすれば簡単に返送できることを確認できます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;
    }
}
于 2013-05-31T09:43:10.167 に答える