我有一个.NET WebAPI
应用程序,这是我的api之一:
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);
}
我从代码analisys中得到CA2000
错误:
错误CA2000在方法' GroupsController.Get(字符串,字符串,字符串, bool,string)',调用System.IDisposable.Dispose on object' response' 在所有引用它之前 范围
所以我修改了这样的代码:
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()
抱怨它无法访问已经处置的对象,即实际的api结果:
System.ObjectDisposedException:无法访问已处置的对象。 对象名称:' System.Net.Http.StringContent'。在 System.Net.Http.HttpContent.CheckDisposed()at System.Net.Http.HttpContent.ReadAsStringAsync()
我该如何解决?处置对象似乎是合理的,但同时测试应该能够访问它
答案 0 :(得分:2)
您可以使用ApiController.OK
return Ok(myResult);
您不应该使用(var response = Request.CreateResponse(HttpStatusCode.OK)),因为ResponseMessageResult将保留对已释放的HttpResponseMessage的引用。这就是你在断言中得到这个错误的原因。
要检查,请将您的代码更改为下面的代码段并在结果上添加断点。检查结果.Response.disposed
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;