2012-04-11 27 views
3

使用OpenRasta並給予下列2個處理器:在OpenRasta中,配置可能不明確的URI是錯誤的嗎?

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被調用,參數firstexample預期。

如果我GET /Hello/example然後HelloWorldHandler2.GetHelloWorld與參數Hello調用時,我期望它被調用example

解決方法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中的錯誤嗎?

回答

2
  1. 是的我會說這是錯的,2.沒有,這不是一個錯誤。

請求/ Hello/example匹配模式/ {test}/{test2},所以如果該模式首次註冊,它將處理該請求。

避免模棱兩可的URIs,以避免模棱兩可的結果:)

+0

謝謝Jorrit - 這是有道理的。唯一令人困惑的部分是來自一個資源的模式正被應用到另一個處理程序。第一個註冊模式獲勝,但最具體的處理程序似乎總是被選中。 – Iain 2012-04-12 11:23:10

+0

這是因爲處理程序註冊資源。 Uris映射到資源。所以如果你有不明確的uris,那麼找不到資源,處理程序將會被刪除。在你的情況下,同一個處理程序爲具有相同URI的兩個資源註冊,所以在處理程序中的所有方法中,離URI更近的那個方法就是被選中的方法。用相同的uri模板註冊兩個資源是一個很大的問題,一般來說,爲多個資源註冊相同的處理程序並不是一個好主意。 – SerialSeb 2012-05-31 21:38:20

相關問題