繁体   English   中英

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

[英]How do I Dispose a HttpResponseMessage in my Web Api Method?

我在所有Wep Api 2控制器上都遇到了Option2000()动词的CA2000错误。

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

我需要支持针对跨域Ajax调用发出的飞行前请求,因此我正在做的只是返回HttpStatusCode.Ok以便随后的发布/发布/删除操作将被触发。

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

我已经尝试过using语句,例如:

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

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

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

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

谢谢!

关于访问已处置对象的异常很明显,因为当执行离开using块时, response已处置,但是您将其从using块和方法中返回。 您无法在方法之外访问该对象,因为它不再存在。

通常,要解决CA2000警告,只需在不再需要HttpResponseMessage类的实例时就对其进行显式处理。

在您的情况下,解决方案可能是重写控制器Dispose方法 (实现ApiController方法),并在那里明确地 ApiController 您的实例 例如检查这个问题

您还可以仅禁止显示警告,并且无论如何该实例将在以后由垃圾收集器处理。 但这不是一个适当的解决方案。

您可以使用HttpRequestMessage类的RegisterForDispose方法RegisterForDispose要处理的响应对象。 .Net基础结构将在处理请求后处理所有注册的对象。

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

范例

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM