使用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>();
如果我获得/first/example
,那么HelloWorldHandler1.GetHelloWorld
会按预期调用参数first
和example
。
如果我获取/Hello/example
,那么当我希望使用HelloWorldHandler2.GetHelloWorld
调用Hello
时,会使用参数example
调用ResourceSpace.Has.ResourcesOfType<Resource2>()
.AtUri("/Hello/{test}")
.HandledBy<HelloWorldHandler2>();
ResourceSpace.Has.ResourcesOfType<Resource1>()
.AtUri("/{test}/{test2}")
.HandledBy<HelloWorldHandler1>();
。
解决方法1
如果我颠倒了配置的顺序:
GET /first/example => HelloWorldHandler1.GetHelloWorld["first","example"]
GET /Hello/example => HelloWorldHandler2.GetHelloWorld["example"]
然后行为符合预期:
ResourceSpace.Has.ResourcesOfType<Resource2>()
.AtUri("/Hello/{somethingelse}")
.HandledBy<HelloWorldHandler2>();
public class HelloWorldHandler2
{
public string GetHelloWorld(string somethingelse)
{
return "Hello.World!";
}
}
解决方法2
如果更改参数名称:
{{1}}
然后行为也符合预期。
问题
答案 0 :(得分:2)
对/ Hello / example的请求匹配模式/ {test} / {test2},因此如果首次注册该模式,它将处理请求。
避免使用含糊不清的URI来避免模棱两可的结果:)