如何在Web Api方法中处理HttpResponseMessage?

时间:2016-04-01 18:54:18

标签: c# asp.net-web-api2

我的所有Wep Api 2控制器上的Options()动词出现CA2000错误。

  

在方法'PromotionController.Options()'中,对象'<> g__initLocal0'未沿所有异常路径布置。

我需要支持跨域ajax调用的飞行前请求,所以我所做的就是返回In [128]: RSS_min = RSS[ij_min] In [129]: RSS_min Out[129]: 8 ,以便后续的post / put / delete将会启动。

HttpStatusCode.Ok

我尝试过这样的using语句:

public HttpResponseMessage Options()
{
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

但是当我使用邮递员的选项请求点击它时,我得到一个例外:

  

无法访问已处置的对象。\ r \ n对象名称:'System.Net.Http.HttpResponseMessage'。

如何以不会引发代码分析错误的方式返回public HttpResponseMessage Options() { using(var response = new HttpResponseMessage()) { response.StatusCode = HttpStatusCode.OK; return response; } }

谢谢!

2 个答案:

答案 0 :(得分:2)

关于访问已处置对象的异常是显而易见的,因为当执行离开using块时,response被释放,但您将其从using块中退出并退出方法。您无法在方法之外访问该对象,因为它根本不存在。

通常,要解决 CA2000 警告,只需在您不再需要它时明确地处理HttpResponseMessage类的实例。

在您的情况下,解决方案可能是覆盖Dispose method of your controller (实施ApiController方法)和明确处理您的实例。检查例如this question

您也可以禁止警告,然后垃圾收集器将稍后处理实例。但这不是一个合适的解决方案。

答案 1 :(得分:1)

您可以使用HttpRequestMessageRegisterForDispose方法注册响应对象以进行处置。 .Net的基础设施将在处理完请求后处理所有注册对象。

我无法保证您之后不会收到错误,但会丢弃该对象以便您可以抑制错误。

示例

HttpResponseMessage response = Request.CreateResponse();
// Do what you need with response
// ...
// ...
request.RegisterForDispose(response);// response will be disposed by host