我意识到点击Backbone.Todos示例“清除x已完成的项目”我得到DELETE 405不允许...
我从以前的帮助和文档中了解到,如果我想启用DELETE PUT PATCH ...我需要设置
X-http-method-override : DELETE
如果是表格或jquery。
但我不确定如何在Backbone.Todos示例中完成此操作,因为我是backbone.js的新手。
请指出如何修复DELETE 405?谢谢。
编辑---------------------------------------
我总是可以将路线改为......
[Route("/todos/add")] //C - post
[Route("/todos/{id}")] //R - get
[Route("/todos/{id}/edit")] //U - post
[Route("/todos/{id}/delete")] //D - post
所以,只有Post和Get足以完成这项工作。但与以下相比,它看起来并不太安静:
[Route("/todos/{id}", "Delete")] //D - delete
是吗?
答案 0 :(得分:5)
Backbone.js对此有特殊支持,您可以通过以下方式启用:
Backbone.emulateHTTP = true
从他们的网站:
如果您想使用不支持的旧版Web服务器 Backbones的默认REST / HTTP方法,您可以选择打开 Backbone.emulateHTTP。设置此选项将伪造PUT和DELETE 使用HTTP POST请求,设置X-HTTP-Method-Override标头 用真正的方法。如果emulateJSON也打开,则true方法将 作为额外的_method参数传递。
Backbone.emulateHTTP = true;
model.save(); // POST to "/collection/id", with "_method=PUT" + header.
405响应可能是因为在IIS中运行了其他东西,比如WebDav,它会在请求到达ServiceStack之前劫持并拒绝请求。否则,如果它在客户端被拒绝,您可能希望enable CORS允许发送其他HTTP谓词。
答案 1 :(得分:2)
经过一番挖掘后,我意识到这不是Backbone设置(顺便说一下,这是backbone.js第34行Backbone.emulateHTTP = false;
)
我检查了Fiddler,它说:
Module WebDAVModule
Notification MapRequestHandler
Handler ServiceStack.Factory
Error Code 0x00000000
这是WebDAV劫持并拒绝了mythz怀疑的请求。然后我发现了如何从web.config中禁用WebDAV:
...
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true"/>
</handlers>
</system.webServer>
...
现在它很愉快。谢谢!