簡體   English   中英

何時處置HttpResponseMessage或HttpContent

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM