我们正在开发一个带有 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>
答案 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)已安装WebDav
且WebDav
模块/处理程序正在拦截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>
,则内部异常应该包含数据库提供的错误信息的详细信息。