gpt4 book ai didi

c# - 何时处理 HttpResponseMessage 或 HttpContent

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:02 25 4
gpt4 key购买 nike

我正在设置一个 API 来与数据库交互,当该 API 收到一个帖子以创建一个已经存在于它的相应表中的条目时,我想返回一个带有解释性消息的代码 209 冲突。所以我尝试了这个:

Controller

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);
}
}
}
}

上下文处理器

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,我认为这是因为我的一个使用 block ,但问题是我不确定它是哪个 block 以及它为什么会导致错误。

编辑:不知何故,我现在才意识到,根据 StackTrace,当 private HttpRequestMessage _request 属性被设置在 HttpResponseMessage

时会抛出异常

最佳答案

不要使用 using block 。只需将它们存储在一个私有(private)变量中,然后通过 Controller 处理来处理它们。此外,您可以对已完成的任务使用 Task.FromResult。

Controller

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);
}
}

关于c# - 何时处理 HttpResponseMessage 或 HttpContent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49882323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com