代码之家  ›  专栏  ›  技术社区  ›  realworldcoder

如何在OpenRasta中显式地指定方法绑定?

  •  2
  • realworldcoder  · 技术社区  · 14 年前

    我在OpenRasta的URL路由方面遇到了很多困难,尤其是当它涉及到放置请求时。

    假设我有一个假设的用户联系处理程序,我需要用以下签名公开它:

    //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服务器)不支持放置/删除。最后,我想通过将上述两个操作都作为一个职位来简化这一过程。不幸的是,一旦我这样做,OpenRasta就无法判断我要绑定到哪种方法,而且两种方法都不起作用-我将得到一个406,对于/create和/contactID请求都不可接受。

    2. 但是,如果我保持上述代码,并且客户机通过x-http-method-override:put头发送,/create请求可以工作,但是/contactid请求仍然返回406。

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

    有没有什么方法可以让openrasta显式地将URL路由映射到某些方法,比如ASP.NET MVC?还是有什么明显的我做错了?

    1 回复  |  直到 14 年前
        1
  •  5
  •   SerialSeb    14 年前

    可以在httpoperation上使用uriname和.named()扩展名metod来帮助openrasta路由到正确的方法。

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

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

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