如何在OpenRasta中明确指定方法绑定?

时间:2010-11-05 01:49:03

标签: api rest binding url-routing openrasta

我在使用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不可接受。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

对于第二个问题,您应该查看调试输出以查看发生的情况。

在genra中,OpenWrap试图阻止您路由到方法,并尽可能努力地让您为不同的资源分离资源。

在您的示例中,您为创建联系人而发布的资源与联系人用户的资源不同,因此可能有两种不同的注册。