【问题标题】:How do I Dispose a HttpResponseMessage in my Web Api Method?如何在我的 Web Api 方法中处理 HttpResponseMessage?
【发布时间】:2016-07-21 16:51:30
【问题描述】:

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

在方法“PromotionController.Options()”中,对象“g__initLocal0”并未沿所有异常路径进行处理。

我需要支持为跨域 ajax 调用发出的飞行前请求,所以我所做的只是返回一个 HttpStatusCode.Ok,以便随后的 post/put/delete 将触发。

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

我尝试过这样的 using 语句:

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

但是当我用 Postman 的 Options 请求点击它时,我得到了一个异常:

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

如何以不会引发代码分析错误的方式返回 HttpStatusCode.Ok

谢谢!

【问题讨论】:

  • 好的,为什么不使用 Owin/CORS 或 WebAPI CORS?
  • @Igor 我在搜索时看到了该帖子,但据我所知,HttpResponseMessage 不支持 RegisterForDispose。只有 HttpRequestMessage 可以。

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


【解决方案1】:

您可以使用HttpRequestMessage 类的RegisterForDispose 方法注册用于处置的响应对象。 .Net 的基础设施将在处理请求后处理所有已注册的对象。

我不能保证在那之后您不会收到错误,但该对象将被释放,以便您可以抑制错误。

示例

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

【讨论】:

    【解决方案2】:

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

    一般来说,要解决 CA2000 警告,只需在您不再需要 HttpResponseMessage 类的实例时显式处理它即可。

    在您的情况下,解决方案可能是覆盖Dispose method of your controller(实现ApiController 方法)并在那里显式处置您的实例。检查例如this question

    您也可以只取消警告,并且实例将在稍后由垃圾收集器处理。但这不是一个合适的解决方案。

    【讨论】:

    • 我希望它们是另一种方式,因为我讨厌压制警告
    • 是的,我绝对同意,我在 Igor 对您问题的评论中链接的答案中读到的内容,您应该至少有两种可能性 - 控制器的 Dispose 方法和 RegisterForDispose 扩展。
    • @Elliott 我的回答是否帮助您解决了问题?如果是,您能否接受它,以便其他人能够更容易地找到答案,好吗?它还允许其他人将类似的问题标记为该问题的重复。
    • @Elliott 谢谢!
    猜你喜欢
    • 2014-05-25
    • 2015-05-22
    • 2017-04-28
    • 2017-06-28
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2015-02-21
    相关资源
    最近更新 更多