ServiceStack Backbone.Todos删除405不允许。

6
当我点击Backbone.Todos示例中的“清除已完成项目”时,我收到了一个DELETE 405不允许的错误消息... 我从之前的帮助和文档中理解,如果我想启用DELETE PUT PATCH ...,我需要设置X-http-method-override:DELETE。如果是表单或在jquery中,可以这样做。但由于我对backbone.js不熟悉,所以我不确定在Backbone.Todos示例中该如何实现此操作。请问您能指出如何修复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就足以完成工作。但与此相比,它看起来并不是很符合Restful的标准:

[Route("/todos/{id}", "Delete")] //D - delete

它有这个功能吗?

2个回答

5

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

Backbone.emulateHTTP = true

从他们的网站上得知:

模拟HTTP Backbone.emulateHTTP = true

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

Backbone.emulateHTTP = true;

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

405响应可能是由于在IIS中运行其他内容(如WebDav),这将劫持并拒绝请求,使其未能到达ServiceStack。否则,如果客户端拒绝请求,则可以启用CORS,以允许发送其他HTTP动词。


2

经过一番搜索,我意识到问题不在Backbone的设置上(顺便说一下,在backbone.js的第34行是Backbone.emulateHTTP = false;

我检查了Fiddler,它显示:

Module  WebDAVModule
Notification  MapRequestHandler
Handler  ServiceStack.Factory
Error Code  0x00000000

正如mythz怀疑的那样,这是WebDAV劫持并拒绝请求。然后我发现了如何从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>
  ...

现在它正快乐地工作。谢谢!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接