我在使用 OpenRasta 的 URL 路由时遇到了很多困难,尤其是在涉及 PUT 请求时。
假设我有一个假设的 UserContact 处理程序,我需要使用以下签名公开它:
//Create a new contact:
POST /users/{userId}/contacts/create
//Update a contact:
PUT /users/{userId}/contact/{contactId}
在这两种情况下,请求正文都包含联系人的表单编码参数。
在我的 Configuration.cs 中,我有:
ResourceSpace.Uses.PipelineContributor<HttpMethodOverriderContributor>();
ResourceSpace.Has.ResourcesOfType<ContactPost>()
.AtUri("/users/{userId}/contacts/create")
.And.AtUri("/users/{userId}/contacts/{contactId}")
.HandledBy<UserContactHandler>()
.AsXmlDataContract()
.And.AsJsonDataContract();
我的处理程序有两种方法:
public OperationResult Post(int userId, ContactPost contact)
public OperationResult Put(int userId, int contactId, ContactPost contact)
我在这段代码中遇到了两个问题:
许多客户端(以及我们的 IIS 服务器)不支持 PUT/DELETE。最终,我想通过将上述两个操作都设为 POST 来简化这一点。不幸的是,一旦我这样做了,OpenRasta 就无法判断我正在尝试绑定哪种方法,而且这两种方法都不起作用 - 我将得到 /create 和 /{contactId} 请求的 406 Not Acceptable 。
但是,如果我保留上述代码并且客户端通过 X-HTTP-Method-Override: PUT 标头发送,则 /create 请求有效,但 /{contactId} 请求仍返回 406。
它甚至没有进入我的处理程序,所以我不确定从哪里开始调试这样的东西。
有没有办法告诉 OpenRasta 将 URL 路由显式映射到 ASP.NET MVC 中的某些方法?或者还有什么明显的我在这里做错了吗?