2

我在使用 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)

我在这段代码中遇到了两个问题:

  1. 许多客户端(以及我们的 IIS 服务器)不支持 PUT/DELETE。最终,我想通过将上述两个操作都设为 POST 来简化这一点。不幸的是,一旦我这样做了,OpenRasta 就无法判断我正在尝试绑定哪种方法,而且这两种方法都不起作用 - 我将得到 /create 和 /{contactId} 请求的 406 Not Acceptable 。

  2. 但是,如果我保留上述代码并且客户端通过 X-HTTP-Method-Override: PUT 标头发送,则 /create 请求有效,但 /{contactId} 请求仍返回 406。

它甚至没有进入我的处理程序,所以我不确定从哪里开始调试这样的东西。

有没有办法告诉 OpenRasta 将 URL 路由显式映射到 ASP.NET MVC 中的某些方法?或者还有什么明显的我在这里做错了吗?

4

1 回答 1

5

您可以使用 HttpOperation 上的 UriName 和 .Named() 扩展方法来帮助 OpenRasta 路由到正确的方法。

对于第二个问题,您应该查看调试输出以了解发生了什么。

一般来说,OpenWrap 试图阻止您路由到方法,并尽其所能让您为不同的资源分离资源。

在您的示例中,您发布以创建联系人的资源与您的联系人用户是不同的资源,因此可能应该有两个不同的注册。

于 2010-11-05T19:34:49.740 回答