У меня есть .NET WebAPI
приложения, и это одна из моих апи:Dispose ответа HTTP в .NET WebAPI
public IHttpActionResult Get()
{
...building myResult here...
var content = ElasticSearch.Json.ToJson(myResult);
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(content, Encoding.UTF8, "application/json");
return ResponseMessage(response);
}
я получаю ошибку CA2000
из кода анализов:
Ошибки CA2000 В методе " GroupsController.Get (строка, строка, строка, bool, string) ', вызов System.IDisposable. Поставьте на объект' response ' , прежде чем все ссылки на него выйдут из scope
Так что я изменил код так:
var content = ElasticSearch.Json.ToJson(myResult);
using (var response = Request.CreateResponse(HttpStatusCode.OK))
{
response.Content = new StringContent(content, Encoding.UTF8, "application/json");
return ResponseMessage(response);
}
До сих пор так хорошо. Нет утечек памяти, и анализатор кода снова рад. К сожалению, сейчас один из моих тестов жалуется, что он больше не может получить доступный объект. Вот тест тестирование, что API (только заключительная часть):
// Assert
var httpResponseMessage = await result.ExecuteAsync(CancellationToken.None);
var resultJson = await httpResponseMessage.Content.ReadAsStringAsync();
Assert.AreEqual(expectedJson, resultJson);
Assert()
жалуется, что не может получить доступ к уже располагал объект, то есть фактический результат апи:
System.ObjectDisposedException: Не удается получить доступ к расположенному объекту. Имя объекта: 'System.Net.Http.StringContent'. в System.Net.Http.HttpContent.CheckDisposed() в System.Net.Http.HttpContent.ReadAsStringAsync()
Как я могу исправить это? Располагая объект кажется разумным, но в то же время тест должен иметь возможность доступа к нему
Можете ли вы убедиться, что httpResponseMessage содержит успешный ответ. В случае неудачного запроса все будет утилизировано, и в этом случае у вас будет эта проблема. Просто отлаживайте тест и посмотрите, что у вас есть в httpResponseMessage до следующей строки. Это также может быть полезно для использования здесь, чтобы понять, что именно происходит. – hellwd