如何在 Web API 2 的 IHttpActionResult 中添加标头?

Nir*_*ole 5 .net c# asp.net-web-api asp.net-web-api2

嗨,我正在使用 Web API 2 开发 API。我知道如何在使用HttpResponseMessage. 现在我正在使用IHttpActionResult.

下面是我的示例当前代码。

return Content(HttpStatusCode.OK, LoginResponse);
Run Code Online (Sandbox Code Playgroud)

返回内容时如何添加标题?

每当我使用时,HttpResponseMessage我都会有请求对象,并且可以添加标头。

下面的代码我在HttpResponseMessage.

response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
response.Headers.AddCookies(new[] { cookie });
return response;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以在哪里添加标题值?

Nko*_*osi 7

您可以继续使用HttpResponseMessage您习惯的方式并更新标头。之后您可以使用该IHttpActionResult ResponseMessage(HttpResponseMessage)方法转换为IHttpActionResult

简单的例子

public class MyApiController : ApiController {

    public IHttpActionResult MyExampleAction() {
        var LoginResponse = new object();//Replace with your model
        var cookie = new CookieHeaderValue("name", "value");//Replace with your cookie

        //Create response as usual
        var response = Request.CreateResponse(System.Net.HttpStatusCode.OK, LoginResponse);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        response.Headers.AddCookies(new[] { cookie });
        //Use ResponseMessage to convert it to IHttpActionResult
        return ResponseMessage(response);
    }
}
Run Code Online (Sandbox Code Playgroud)


pec*_*eco 5

您可以创建一个自定义IHttpActionResult来装饰真实的自定义,但公开一种操作响应的方法:

public class CustomResult : IHttpActionResult
{
    private readonly IHttpActionResult _decorated;
    private readonly Action<HttpResponseMessage> _response;

    public CustomResult(IHttpActionResult decorated, Action<HttpResponseMessage> response)
    {
        _decorated = decorated;
        _response = response;
    }

    public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = await _decorated.ExecuteAsync(cancellationToken);

        _response(response);

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

然后在您的操作中使用它:

return new CustomResult(Content(HttpStatusCode.OK, loginResponse), res => res.Headers.AddCookies(new []{ cookie}));
Run Code Online (Sandbox Code Playgroud)