不允许 ServiceStack Backbone.Todos 删除 405

Posted

技术标签:

【中文标题】不允许 ServiceStack Backbone.Todos 删除 405【英文标题】:ServiceStack Backbone.Todos Delete 405 not allowed 【发布时间】:2012-09-25 05:58:58 【问题描述】:

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

我从以前的帮助和文档中了解到,如果我想启用 DELETE PUT PATCH ...我需要设置

X-http-method-override : DELETE

如果它是一个表单或在 jquery 中。

但我不确定在 Backbone.Todos 示例中这是如何完成的,因为我是新的主干.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

是吗?

【问题讨论】:

【参考方案1】:

经过一番挖掘,我意识到这不是 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>
  ...

现在它运行良好。谢谢!

【讨论】:

【参考方案2】:

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 动词。

【讨论】:

以上是关于不允许 ServiceStack Backbone.Todos 删除 405的主要内容,如果未能解决你的问题,请参考以下文章

覆盖Backbone.ajax方法以使用cordovaHTTP

ServiceStack 的 JsonSerializer 可以序列化私有成员吗?

.net Redis 消息中间件 ServiceStack.Redis 轻量级

listenTo - backbone.js

ServiceStack JsonSerializer 不序列化公共成员

Servicestack导致承载令牌无效