Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net MVC 4 for PUT请求-响应409-冲突_C#_Api_Http_Asp.net Mvc 4_Iis - Fatal编程技术网

C# ASP.Net MVC 4 for PUT请求-响应409-冲突

C# ASP.Net MVC 4 for PUT请求-响应409-冲突,c#,api,http,asp.net-mvc-4,iis,C#,Api,Http,Asp.net Mvc 4,Iis,我们正在进行一个项目,其中包括一个asp.net mvc 4站点和ios和Android的移动应用程序。我们想让API(适用于移动应用)和网站与共享代码库一起工作。 我们创建了一个API区域,在其中编写“业务逻辑”和API响应,网站使用这些类。此外,还有一些路由选项可以将它们用作API GET和POST方法工作得很好,一切都很有魅力,但是当涉及到PUT-更新方法-it崩溃时 首先,我们得到一个403错误代码,说写访问是被禁止的(实际上这只是数据库修改,所以我们不知道它可能是什么)。当我们允许在I

我们正在进行一个项目,其中包括一个asp.net mvc 4站点和ios和Android的移动应用程序。我们想让API(适用于移动应用)和网站与共享代码库一起工作。 我们创建了一个API区域,在其中编写“业务逻辑”和API响应,网站使用这些类。此外,还有一些路由选项可以将它们用作API

GET和POST方法工作得很好,一切都很有魅力,但是当涉及到PUT-更新方法-it崩溃时

首先,我们得到一个403错误代码,说写访问是被禁止的(实际上这只是数据库修改,所以我们不知道它可能是什么)。当我们允许在IIS中写入应用程序文件夹时,它发生了变化

现在,我们为每个PUT方法请求获得一个“HTTP/1.1409冲突”。我们已经尝试并阅读了几乎所有我们发现的东西。有人知道是什么导致了这个问题吗

编辑: 下面是一些代码: 行动:

    [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;
    }
答复是:

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>
HTTP/1.1409冲突
日期:2014年2月7日星期五格林尼治标准时间15:20:22
服务器:Microsoft IIS/6.0
X-Powered-By:ASP.NET
内容类型:text/html
内容长度:43
途径:1.1 domain.com
保持活动状态:超时=15,最大=100
连接:保持活力
HTTP/1.1409冲突

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


Microsoft.NET\Framework\v4.0.30319\aspnet\u isapi.dll

我也遇到过类似的问题,但对我来说原因不同。我将webapi与restful路径一起使用,
PUT
用于更新资源(指定方式类似于
/api/products/id
)。一切都很好,直到我搬到prod env,然后我开始收到
409冲突

事实证明,prod server(IIS 7.5)安装了
WebDav
,并且
WebDav
模块/处理程序正在拦截
put
,导致应用程序中断。禁用
WebDav
(在站点级别)并删除WebDav模块/处理程序解决了该问题


(在
WebDav
上有很多信息会干扰
RESTful
,但是我没有找到任何特别提到
409冲突的内容,所以我希望这对未来的访问者有用)

另一个可能的原因是,在ASP.NET MVC web方法中将数据保存到数据库时返回HTTP 409:ASP.NET MVC可能会返回HTTP 409响应,以响应由于外键错误而发生未处理的
DbUpdateException
调用


如果在服务器端代码中捕获了
DbUpdateException
,则内部异常应该包含数据库提供的错误信息的详细信息。

显示一个失败的示例PUT请求;向我们显示您的控制器代码及其正在更新的模型,以及保存此实体的ORM或数据库代码。A,但是如果我们看不到代码,我们看不到代码中的原因。使用额外信息扫描编辑您是否共享原始请求?你可以使用谷歌浏览器的邮递员来生成一个。我看到过一些类似的案例。区别在于连接是“关闭”的,而不是“保持活动”。这会导致问题吗?PreparePut方法的作用是什么?
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>