我有一个C#实体框架Web 2控制器。当前,当试图通过POST方法为主文本字段创建具有相同文本的对象时,我将返回409冲突错误作为StatusCode结果,以指示添加被视为重复。
我想要做的是返回触发重复错误的服务器端对象。因此,我需要类似于 OK ()方法的东西,但是一个变体返回409冲突错误作为HTTP代码,而不是HTTP状态代码。
有这样的事吗?我该怎么做?如果我能够完成这项工作,客户端就不必在接收到409冲突错误后对服务器执行后续的 get 调用来获取现有对象。
下面是当前的POST方法:
public IHttpActionResult PostCanonical(Canonical canonical)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Check for duplicate Canonical text for the same app name.
if (db.IsDuplicateCanonical(canonical.AppName, canonical.Text))
{
// It's a duplicate. Return an HTTP 409 Conflict error to let the client know.
return StatusCode(HttpStatusCode.Conflict);
}
db.CanonicalSentences.Add(canonical);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = canonical.ID }, canonical);
}发布于 2015-08-07 12:39:23
编辑:此解决方案适用于WebApi以前的v5,如果您使用的是v5或更高版本,请参见this answer。
您可以返回一个NegotiatedContentResult<T>,它允许您指定状态代码和要放入http消息体中的对象。
将代码更改为如下内容:
public IHttpActionResult PostCanonical(Canonical canonical)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Check for duplicate Canonical text for the same app name.
if (db.IsDuplicateCanonical(canonical.AppName, canonical.Text))
{
// It's a duplicate. Return an HTTP 409 Conflict error to let the client know.
var original = db.CanonicalSentences.First(c => c.ID == canonical.ID);
return new NegotiatedContentResult<T>(HttpStatusCode.Conflict, original, this);
}
db.CanonicalSentences.Add(canonical);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = canonical.ID }, canonical);
}或者把它包装成这样的扩展方法:
public static class HttpActionResultExtensions {
public static IHttpActionResult StatusCodeWithContent<T>(this ApiController @this, HttpStatusCode statusCode, T content) {
return new NegotiatedContentResult<T>(statusCode, content, @this);
}
}然后像这样使用扩展名:
public IHttpActionResult PostCanonical(Canonical canonical)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Check for duplicate Canonical text for the same app name.
if (db.IsDuplicateCanonical(canonical.AppName, canonical.Text))
{
// It's a duplicate. Return an HTTP 409 Conflict error to let the client know.
var original = db.CanonicalSentences.First(c => c.ID == canonical.ID);
return StatusCodeWithContent(HttpStatusCode.Conflict, original)
}
db.CanonicalSentences.Add(canonical);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = canonical.ID }, canonical);
}发布于 2017-04-11 02:08:33
您应该返回内容:
return Content(HttpStatusCode.Conflict, original);Content是ApiController类上的方法,它将使用提供的HttpStatusCode和内容创建NegotiatedContentResult。没有必要像在接受的答案中那样在ApiController类上创建自己的扩展方法。
发布于 2018-08-13 08:13:33
来到这里寻找帮助的ASP.NET核心HTTP 409 -这是相关的,只是较新的方法来解决同样的问题。
冲突ActionResult
return Conflict(new { message = $"An existing record with the id '{id}' was already found."});https://stackoverflow.com/questions/31866418
复制相似问题