【问题标题】:object 'new HttpResponseMessage()' is not disposed along all exception paths对象 'new HttpResponseMessage()' 未沿所有异常路径处理
【发布时间】:2017-12-05 07:52:33
【问题描述】:

通过stackoverflow中的链接后,我已经厌倦了使用语句,但仍然无法找到确切的解决方案。

 using (MemoryStream stream = new MemoryStream(textAsBytes))
            {
                using (HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StreamContent(stream)
                })
                {
                    httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = "main-theme.scss"
                    };
                    httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/css");

                    ResponseMessageResult responseMessageResult = ResponseMessage(httpResponseMessage);
                    return responseMessageResult;
                }
            }

出现以下错误

CA2000 在方法“GetStyleSheet()”中,对象“new HttpResponseMessage()”并未沿所有异常路径进行处理。在对对象“new HttpResponseMessage()”的所有引用超出范围之前调用 System.IDisposable.Dispose。

【问题讨论】:

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


    【解决方案1】:

    问题在于,在创建HttpResponseMessage 时,除了构造函数之外,您还使用了属性初始化器:

    using (HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
    {
      Content = new StreamContent(stream)
    })
    {
      // ...
    }
    

    这导致生成类似于以下的代码:

    var httpRepsonseMessage = new HttpResponseMessage(HttpStatusCode.OK);
    httpResponseMessage.Content = new StreamContent(stream);
    try
    {
       // ...
    }
    finally
    {
      httpResponseMessage.Dispose();
    }
    

    如您所见,如果在创建和分配 StreamContent 时出现问题,httpResponseMessage 将不会被释放。

    为了解决这个问题,将赋值移动到 using 块中:

    using (HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK))
    {
      httpResponseMessage.Content = new StreamContent(stream);
      // ...
    }
    

    这样,即使在分配内容时出现问题,也会进行处置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2013-06-09
      • 2016-02-11
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多