3

使用 OpenRasta 并给出以下 2 个处理程序:

public class HelloWorldHandler1
{
    public string GetHelloWorld(string test, string test2)
    {
        return "Hello.World!";
    }
}

public class HelloWorldHandler2
{
    public string GetHelloWorld(string test)
    {
        return "Hello.World!";
    }
}

配置如下

ResourceSpace.Has.ResourcesOfType<Resource1>()
    .AtUri("/{test}/{test2}")
    .HandledBy<HelloWorldHandler1>();

ResourceSpace.Has.ResourcesOfType<Resource2>()
    .AtUri("/Hello/{test}")
    .HandledBy<HelloWorldHandler2>();

如果我 GET 则按/first/example预期使用HelloWorldHandler1.GetHelloWorld参数调用firstexample

如果我 GET/Hello/example然后在我期望它被调用时HelloWorldHandler2.GetHelloWorld使用参数调用。Helloexample

解决方法 1

如果我颠倒配置的顺序:

ResourceSpace.Has.ResourcesOfType<Resource2>()
    .AtUri("/Hello/{test}")
    .HandledBy<HelloWorldHandler2>();

ResourceSpace.Has.ResourcesOfType<Resource1>()
    .AtUri("/{test}/{test2}")
    .HandledBy<HelloWorldHandler1>();

然后行为如预期:

GET /first/example => HelloWorldHandler1.GetHelloWorld["first","example"]
GET /Hello/example => HelloWorldHandler2.GetHelloWorld["example"]

解决方法 2

如果更改参数名称:

ResourceSpace.Has.ResourcesOfType<Resource2>()
    .AtUri("/Hello/{somethingelse}")
    .HandledBy<HelloWorldHandler2>();

public class HelloWorldHandler2
{
    public string GetHelloWorld(string somethingelse)
    {
        return "Hello.World!";
    }
}

然后行为也符合预期。

问题

  1. 尝试以这种方式配置 URI 有错吗?他们在哪些地方可能不明确应该调用哪个处理程序?
  2. 这是 OpenRasta 中的错误吗?
4

1 回答 1

2
  1. 是的,我会说这是错误的,2. 不,这不是错误。

对 /Hello/example 的请求与模式 /{test}/{test2} 匹配,因此如果首先注册该模式,它将处理请求。

避免模​​棱两可的 URI 以避免模棱两可的结果 :)

于 2012-04-12T06:21:17.690 回答