在.NET WebAPI

时间:2017-02-10 10:48:54

标签: c# http asp.net-web-api

我有一个.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()

我该如何解决?处置对象似乎是合理的,但同时测试应该能够访问它

1 个答案:

答案 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;