2010-11-05 81 views
2

我在OpenRasta的URL路由中遇到了很多困难,特别是当涉及到PUT请求时。如何在OpenRasta中明确指定方法绑定?

比方说,我有一个假设的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("https://stackoverflow.com/users/{userId}/contacts/create") 
    .And.AtUri("https://stackoverflow.com/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-方法-覆盖发送:PUT头那么/创建请求的作品,但是/ {的ContactID}请求还是返回406

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

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

回答

5

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

对于你的第二个问题,你应该看看调试输出,看看发生了什么。

在一般情况下,OpenWrap试图阻止您路由到方法,并尽可能地努力让您为不同的资源分开资源。

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

+0

谢谢,但我不知道为什么这是一个不同的资源。 UserContact实体及其属性在两种情况下都完全相同。我真的想避免创建两个完全相同的类,或者至少了解Resource的定义是什么。 – realworldcoder 2010-11-05 20:46:00

+3

资源是一个具有一个URI并代表一个概念的东西。 “用户列表”资源与“id xx用户”资源不同,它与“i编辑用户”资源也不同。因此/ users,/ users/21和/ users/21/edit都是不同的资源。那就是为什么你应该在注册时为每个人创建一个资源类,这就明确了区别。 – SerialSeb 2010-11-08 21:23:51

+0

+1我在建模资源和方法时遇到困难,此答案有助于澄清事物 – 2011-05-19 07:24:39