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>();

I GET の場合/first/exampleHelloWorldHandler1.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 に答える