Rob*_*ler 16 c# asp.net-mvc entity-framework-6 asp.net-web-api2
我有一个C#Entity Framework Web API 2控制器.目前,当通过POST方法尝试创建具有相同文本的主文本字段的对象时,我返回409 Conflict错误作为StatusCode结果,以指示添加被视为重复.
我想做的是返回触发重复错误的服务器端对象.所以我需要一些类似于Ok()方法的东西,但是一个变量返回409 Conflict错误作为HTTP状态代码而不是HTTP OK状态代码.
有这样的事吗?我怎样才能做到这一点?如果我可以完成这项工作,客户端在收到409 Conflict错误后不必对服务器进行后续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);
}
Run Code Online (Sandbox Code Playgroud)
Kie*_*ran 19
你应该退回内容:
return Content(HttpStatusCode.Conflict, original);
Run Code Online (Sandbox Code Playgroud)
Content是ApiController类的方法,它将创建一个NegotiatedContentResult提供HttpStatusCode和内容.无需像在接受的答案中那样在ApiController类上创建自己的扩展方法.
Sli*_*SFT 16
来到这里寻求 ASP.NET Core HTTP 409 的帮助 - 这是相关的,只是解决同一问题的较新方法。
return Conflict(new { message = $"An existing record with the id '{id}' was already found."});
Run Code Online (Sandbox Code Playgroud)
Ani*_*tel 14
编辑:此解决方案适用于v5之前的WebApi,如果您使用的是v5或更高版本,请参阅此答案.
您可以返回一个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);
}
Run Code Online (Sandbox Code Playgroud)
或者可以用这样的扩展方法包装它:
public static class HttpActionResultExtensions {
public static IHttpActionResult StatusCodeWithContent<T>(this ApiController @this, HttpStatusCode statusCode, T content) {
return new NegotiatedContentResult<T>(statusCode, content, @this);
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用扩展名:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15305 次 |
| 最近记录: |