首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回由实体框架支持的Web 2 POST调用中的对象和409冲突错误?

返回由实体框架支持的Web 2 POST调用中的对象和409冲突错误?
EN

Stack Overflow用户
提问于 2015-08-06 21:50:43
回答 4查看 36.8K关注 0票数 29

我有一个C#实体框架Web 2控制器。当前,当试图通过POST方法为主文本字段创建具有相同文本的对象时,我将返回409冲突错误作为StatusCode结果,以指示添加被视为重复。

我想要做的是返回触发重复错误的服务器端对象。因此,我需要类似于 OK ()方法的东西,但是一个变体返回409冲突错误作为HTTP代码,而不是HTTP状态代码。

有这样的事吗?我该怎么做?如果我能够完成这项工作,客户端就不必在接收到409冲突错误后对服务器执行后续的 get 调用来获取现有对象。

下面是当前的POST方法:

代码语言:javascript
复制
    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);
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-07 12:39:23

编辑:此解决方案适用于WebApi以前的v5,如果您使用的是v5或更高版本,请参见this answer

您可以返回一个NegotiatedContentResult<T>,它允许您指定状态代码和要放入http消息体中的对象。

将代码更改为如下内容:

代码语言:javascript
复制
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);
}

或者把它包装成这样的扩展方法:

代码语言:javascript
复制
public static class HttpActionResultExtensions {
    public static IHttpActionResult StatusCodeWithContent<T>(this ApiController @this, HttpStatusCode statusCode, T content) {
        return new NegotiatedContentResult<T>(statusCode, content, @this);
    }
}

然后像这样使用扩展名:

代码语言:javascript
复制
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);
}
票数 15
EN

Stack Overflow用户

发布于 2017-04-11 02:08:33

您应该返回内容:

代码语言:javascript
复制
return Content(HttpStatusCode.Conflict, original);

ContentApiController类上的方法,它将使用提供的HttpStatusCode和内容创建NegotiatedContentResult。没有必要像在接受的答案中那样在ApiController类上创建自己的扩展方法。

票数 33
EN

Stack Overflow用户

发布于 2018-08-13 08:13:33

来到这里寻找帮助的ASP.NET核心HTTP 409 -这是相关的,只是较新的方法来解决同样的问题。

冲突ActionResult

代码语言:javascript
复制
 return Conflict(new { message = $"An existing record with the id '{id}' was already found."});
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31866418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档