【问题标题】:How to Explicitly Specify Method Bindings in OpenRasta?如何在 OpenRasta 中显式指定方法绑定?
【发布时间】:2010-11-05 01:49:03
【问题描述】:

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

我的 Handler 有两种方法:

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 中的某些方法?或者还有什么明显的我在这里做错了吗?

【问题讨论】:

    标签: api rest binding url-routing openrasta


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,但我不确定为什么这是一个不同的资源。 UserContact 实体及其属性在这两种情况下完全相同。我真的很想避免创建两个相同的类,或者至少了解 Resource 的定义是什么。
    • 资源是具有一个 URI 并代表一个概念的事物。 “用户列表”资源不同于“id xx 的用户”资源,也不同于“我编辑用户”资源。因此 /users、/users/21 和 /users/21/edit 都是不同的资源。这就是为什么您应该在注册时为每个资源类创建一个资源类,它明确区分。
    • +1 我在为我的资源和方法建模时遇到了困难,这个答案有助于澄清事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2021-01-29
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多