6

我意识到当单击 Backbone.Todos 示例“清除 x 已完成的项目”时,我得到一个 DELETE 405 not allowed...

我从以前的帮助和文档中了解到,如果我想启用 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

可以?

4

2 回答 2

5

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

Backbone.emulateHTTP = true

从他们的网站:

emulateHTTP Backbone.emulateHTTP = true

如果您想使用不支持 Backbones 的默认 REST/HTTP 方法的旧版 Web 服务器,您可以选择打开 Backbone.emulateHTTP。设置此选项将使用 HTTP POST 伪造 PUT 和 DELETE 请求,使用 true 方法设置 X-HTTP-Method-Override 标头。如果 emulateJSON 也打开,则 true 方法将作为附加的 _method 参数传递。

Backbone.emulateHTTP = true;

model.save();  // POST to "/collection/id", with "_method=PUT" + header.

405 响应可能是在 IIS 中运行其他东西(如 WebDav)的结果,它会在请求到达 ServiceStack 之前劫持并拒绝请求。否则,如果它在客户端被拒绝,您可能需要启用 CORS以允许发送额外的 HTTP 动词。

于 2012-10-04T14:23:12.340 回答
2

经过一番挖掘,我意识到这不是 Backbone 设置(Backbone.emulateHTTP = false;顺便说一下,在backbone.js的第34行)

我检查了 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>
  ...

现在它可以愉快地工作了。谢谢!

于 2012-10-04T23:55:56.327 回答