![](/img/trans.png)
[英]When or if to Dispose HttpResponseMessage when calling ReadAsStreamAsync?
[英]When to dispose of a HttpResponseMessage or a HttpContent
我正在設置一個API來與數據庫進行交互,當api收到一個帖子來創建一個已經存在於其各自表中的條目時,我想返回一個代碼209與一條解釋性消息沖突。 所以我嘗試了這個:
調節器
public async Task<IHttpActionResult> PostOrganizationAsync(Organization organization)
{
using (var context = new ContextHandler())
{
bool added = await context.AddOrganizationAsync(organization);
if (added)
{
return Ok();
}
else
{
using (var httpContent = new StringContent("An organization with this Id already exists on the database"))
{
return new CustomHttpResponse(HttpStatusCode.Conflict, httpContent);
}
}
}
}
ContextHandler中
class ContextHandler : IDisposable
{
static AuditLogsEntities LogDatabaseContext;
public ContextHandler()
{
LogDatabaseContext = new AuditLogsEntities();
LogDatabaseContext.Configuration.LazyLoadingEnabled = false;
}
public void Dispose()
{
LogDatabaseContext.Dispose();
}
public async Task<bool> AddOrganizationAsync(Organization organization)
{
var findOrg = await LogDatabaseContext.OrganizationSet.FindAsync(organization.Id);
if (findOrg != null)
{
return false;
}
else
{
LogDatabaseContext.OrganizationSet.Add(organization);
await LogDatabaseContext.SaveChangesAsync();
return true;
}
}
}
CustomHttpResponse
public class CustomHttpResponse : IHttpActionResult
{
public HttpStatusCode StatusCode;
public HttpContent Content;
public CustomHttpResponse(HttpStatusCode httpStatusCode, HttpContent httpContent)
{
StatusCode = httpStatusCode;
Content = httpContent;
}
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
{
HttpResponseMessage httpResponse = null;
using (httpResponse = new HttpResponseMessage(StatusCode))
{
httpResponse.Content = Content;
return httpResponse;
}
}
}
發布一個新的有效條目工作正常,但嘗試發布一個已經存在的條目來測試209響應導致一個ObjectDisposedException
,我認為這是因為我的一個using
塊發生,但問題是我不確定是哪個阻止它是為什么會導致錯誤。
編輯:我不知何故現在才意識到,根據StackTrace,當在HttpResponseMessage
中設置private HttpRequestMessage _request
屬性時拋出異常
不要使用塊。 只需將它們存儲在一個私有變量中,並通過控制器處理它們進行處理。 此外,您可以使用Task.FromResult完成已完成的任務。
調節器
private StringContent _httpContent
private CustomHttpResponse _customHttpResponse
public async Task<IHttpActionResult> PostOrganizationAsync(Organization organization)
{
using (var context = new ContextHandler())
{
bool added = await context.AddOrganizationAsync(organization);
if (added)
{
return Ok();
}
else
{
this._httpContent = new StringContent("An organization with this Id already exists on the database"))
this._customHttpResponse = new CustomHttpResponse(HttpStatusCode.Conflict, httpContent);
return this._customHttpResponse;
}
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (this._httpContent != null)
{
this._httpContent.Dispose();
}
if (this._customHttpResponse != null)
{
this._customHttpResponse.Dispose();
}
}
}
CustomHttpResponse
public class CustomHttpResponse : IHttpActionResult
{
public HttpStatusCode StatusCode;
public HttpContent Content;
public CustomHttpResponse(HttpStatusCode httpStatusCode, HttpContent httpContent)
{
StatusCode = httpStatusCode;
Content = httpContent;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage httpResponse = new HttpResponseMessage(StatusCode);
httpResponse.Content = Content;
return Task.FromResult(httpResponse);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.