C# ASP.Net MVC 4 for PUT请求-响应409-冲突
我们正在进行一个项目,其中包括一个asp.net mvc 4站点和ios和Android的移动应用程序。我们想让API(适用于移动应用)和网站与共享代码库一起工作。 我们创建了一个API区域,在其中编写“业务逻辑”和API响应,网站使用这些类。此外,还有一些路由选项可以将它们用作API GET和POST方法工作得很好,一切都很有魅力,但是当涉及到PUT-更新方法-it崩溃时 首先,我们得到一个403错误代码,说写访问是被禁止的(实际上这只是数据库修改,所以我们不知道它可能是什么)。当我们允许在IIS中写入应用程序文件夹时,它发生了变化 现在,我们为每个PUT方法请求获得一个“HTTP/1.1409冲突”。我们已经尝试并阅读了几乎所有我们发现的东西。有人知道是什么导致了这个问题吗 编辑: 下面是一些代码: 行动: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
[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>