【问题标题】:CA2000 Warning in my controller我的控制器中的 CA2000 警告
【发布时间】:2017-02-02 19:15:38
【问题描述】:

我正在为 SPA 应用程序开发 Web API。我试图弄清楚如何在我的一个控制器中消除 CA2000 警告。下面的代码会生成一个 CA2000 警告-

    [Route("Execution/TestCaseOrExecutionExcelExport")]
    [HttpPost]
    public HttpResponseMessage GetTestCaseOrExecutionExcelExport([FromBody] dynamic data)
    {
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

        using (result)
        {
            ...
            result.Headers.AcceptRanges.Add("bytes");
            result.Content = new ByteArrayContent(bytes);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
        }
            return result;
    }

如果我将上面的内容更改如下,我会收到“并非所有路径都返回值”错误,因为函数返回 HttpResponseMessage-

    [Route("Execution/TestCaseOrExecutionExcelExport")]
    [HttpPost]
    public HttpResponseMessage GetTestCaseOrExecutionExcelExport([FromBody] dynamic data)
    {
  using (HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK))
        {    
             ...
             return result;
        }
     }

另一个注意事项,下面的代码给出了错误“无法访问已处置的对象”。但确实摆脱了 ca2000 警告-

   [Route("Execution/TestCaseOrExecutionExcelExport")]
    [HttpPost]
    public HttpResponseMessage GetTestCaseOrExecutionExcelExport([FromBody] dynamic data)
    {
        using (result = new HttpResponseMessage(HttpStatusCode.OK))
        {
    ...
    }
    return result;
}

尝试没有太多运气的事情。

如何编写代码以消除 CA2000 警告?

**更新:修复了这个问题,只是不知道为什么我做了什么解决了我的问题。我唯一做的就是移动 HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);在类级别的方法之外的行。为什么对象会在类级别而不是在方法内处理?

【问题讨论】:

  • 在类级别使用它,您应该获得 CA2213,但显然存在一个限制,即如果您有一次性基类,CA2213 就不能很好地工作。看到今天别人问的这个问题:stackoverflow.com/questions/42032088/…

标签: c# asp.net .net asp.net-web-api dispose


【解决方案1】:

您可以使用 Request.CreateResponse 而不是使用新 HttpResponseMessage 的构造函数。由于某些原因,请参阅此已接受的答案:When Use HttpResponseMessage and Request.CreateResponse

在使用这种方法时,我从未见过 CA2000。

【讨论】:

  • 你是对的,它不会产生 CA2000 警告。我将如何添加自定义听到更改(一些出现在我的示例中)?
  • 您仍然将 Request.CreateResponse(...) 分配给一个变量,然后您应该能够对该变量执行几乎任何您需要的操作。大多数情况下,您只是用new 更改一行,然后删除using 行和花括号。保留那些花括号里面的东西,你应该很好。
  • 完美!谢谢!
猜你喜欢
  • 2011-03-02
  • 2018-07-22
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多