2017-02-10 2 views
0

У меня есть .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()

Как я могу исправить это? Располагая объект кажется разумным, но в то же время тест должен иметь возможность доступа к нему

+0

Можете ли вы убедиться, что httpResponseMessage содержит успешный ответ. В случае неудачного запроса все будет утилизировано, и в этом случае у вас будет эта проблема. Просто отлаживайте тест и посмотрите, что у вас есть в httpResponseMessage до следующей строки. Это также может быть полезно для использования здесь, чтобы понять, что именно происходит. – hellwd

ответ

2

Вы можете использовать ApiController.OK

return Ok(myResult); 

Вы не должны использовать с помощью (ответ вар = Request.CreateResponse (HttpStatusCode. OK)), потому что ResponseMessageResult будет ссылаться на расположенный HttpResponseMessage. Вот почему вы получаете эту ошибку в assert.

Чтобы проверить, измените свой код на фрагмент ниже и добавьте точку останова на результат. Проверьте результат. Ответ.

using (var response = Request.CreateResponse(HttpStatusCode.OK)) 
     { 
      response.Content = new StringContent(content, Encoding.UTF8, "application/json"); 
      result = ResponseMessage(response); 
     } 

     // result.Response.disposed is true hence error in assert. 
     return result; 
Смежные вопросы