ASP.Net MVC 4用于PUT请求响应409 - 冲突

时间:2014-02-07 13:42:37

标签: c# api http asp.net-mvc-4 iis

我们正在开发一个带有 asp.net mvc 4 网站和ios和Android移动应用程序的项目。我们希望 API (针对移动应用)以及使用共享代码库的网站。 我们创建了一个API区域,其中编写了“业务逻辑”和api响应,并且网站使用这些类。此外,还有一些路由选项可以将它们用作API。

GET和POST方法运作完美,一切都像魅力一样,但当涉及 PUT - 更新方法时 - 它崩溃

首先,我们有一个403错误代码,禁止写入访问(实际上它只是数据库修改,所以我们不明白它是什么)。当我们允许在IIS中编写app文件夹时,它发生了变化。

现在我们为每个PUT方法请求获得“ HTTP / 1.1 409冲突”。我们已经尝试并阅读了我们发现的几乎所有内容。有没有人知道会导致这个问题的原因是什么?

修改 这是一些代码: 行动:

    [HttpPut]
    [ApiAuth]
    [ActionName("Workitem")]
    public bool Workitem(int id, [FromBody]WorkItem model)
    {
        WorkItem item = Db.WorkItems.Find(id);
        if (item == null)
        {
            Logger.Warn("JobRoute/PutWorkItem: not found workitem");
            throw ErrorHelper.CreateApiException(HttpStatusCode.NotFound, "Not found workitem");
        }
        PreparePut(item);
        item.Active = model.Active;
        item.Name = model.Name;
        Db.Entry(item).State = System.Data.Entity.EntityState.Modified;
        try
        {
            Db.SaveChanges();
            return true;
        }
        catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException)
        {
            Logger.Warn("PUT User/User: Workitem not found");
            throw ErrorHelper.CreateApiException(HttpStatusCode.NotFound, "Workitem not found");
        }
    }

这是模特。

public class WorkItem : BaseModel
{
    public string Name { get; set; }
}

public class BaseModel
{
    [Key]
    public int Id { get; set; }
    public Nullable<System.DateTime> InsertDate { get; set; }
    public Nullable<System.DateTime> LastChangeDate { get; set; }
    public bool Active { get; set; }
}

protected void PreparePut(BaseModel model)
    {
        PrepareModificationDate(model);
    }

protected void PrepareModificationDate(BaseModel model)
    {
        model.LastChangeDate = DateTime.Now;
    }

它在localhost上运行的奇怪之处在于发布之后没有。

http://domain.com/api/work/workitem/ {ID} [放] 对于授权,我们为令牌提供额外的HTTP标头。

身体: 名称=测试+名称&安培;活动=真

原始形式:

PUT http://domain.com/api/work/workitem/1
HTTP/1.1 Host: domain.com
Connection: keep-alive
Content-Length: 22
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
X-Auth-Session: c796a0a5c1ea9395196bf47abdbb273a
User-Agent: Mozilla/5.0 (Windows NT
6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4
Cookie:__RequestVerificationToken=eRxqkQZMPrRvY-ugp2tkge5UuAxS3arksJh7H17GE_H_ytSd_gLwpzTD3H276MoIgmyugoI3dMjh6M0Ursqomg2; ASP.NET_SessionId=dibvmeuiojsmphefbiifvkso

Name=Teszt&Active=true

回复是:

HTTP/1.1 409 Conflict
Date: Fri, 07 Feb 2014 15:20:22 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Type: text/html
Content-Length: 43
Via: 1.1 domain.com
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive

<body><h2>HTTP/1.1 409 Conflict</h2></body>

3 个答案:

答案 0 :(得分:1)

这是一个IIS配置问题。它需要一个额外的ISAPI dll:

Microsoft.NET \框架\ v4.0.30319 \ ASPNET_ISAPI.DLL

答案 1 :(得分:1)

我遇到了类似的问题,但对我来说原因却不一样。我正在使用带有restful路径的webapi,PUT用于更新资源(指定类似于/api/products/id)。一切都工作正常,直到我进入prod env。然后我开始接收409 Conflict

事实证明,prod服务器(IIS 7.5)已安装WebDavWebDav模块/处理程序正在拦截PUTs导致应用程序中断。禁用WebDav(在站点级别)并删除WebDav模块/处理程序解决了这个问题。

WebDav上有很多信息干扰RESTful,但我无法在此背景下找到任何具体提及409 Conflict的信息,所以我希望这将对未来的访问者有用)

答案 2 :(得分:0)

从您将数据保存到数据库的ASP.NET MVC Web方法返回HTTP 409的另一个可能原因:ASP.NET MVC可能会对未处理的{{}处理的调用返回HTTP 409响应由于外键错误而发生{1}}。

如果您在服务器端代码中捕获<div id="container"> <div id="container-scroller"> <header> <h1>Title</h1> </header> <p>content</p> <p>content</p> <p>content</p> </div> </div>,则内部异常应该包含数据库提供的错误信息的详细信息。