объект 'new HttpResponseMessage()' не расположен по всем путям исключений

Я устал использовать оператор после просмотра ссылок в 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()' не размещается по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта «new HttpResponseMessage()», прежде чем все ссылки на него будут вне области видимости.


person Yashwanth Chowdary Kata    schedule 05.12.2017    source источник


Ответы (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();
}

Как видите, httpResponseMessage не будет удален, если что-то пойдет не так при создании StreamContent и его назначении.

Чтобы решить эту проблему, переместите присваивание в блок using:

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

Таким образом, удаление происходит, даже если возникает проблема при назначении содержимого.

person Markus    schedule 05.12.2017