ServiceStack Backbone.Todos不允许删除405

时间:2012-10-04 08:25:36

标签: c# backbone.js servicestack http-status-code-405

我意识到点击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

是吗?

2 个答案:

答案 0 :(得分:5)

Backbone.js对此有特殊支持,您可以通过以下方式启用:

Backbone.emulateHTTP = true

从他们的网站:

emulateHTTP 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>
  ...

现在它很愉快。谢谢!