2013-07-15 45 views
1

ServiceStack剃鬚刀行爲我有這些設置:當路徑不存在

CustomHttpHandlers = { 
     {HttpStatusCode.NotFound, new RazorHandler("/notfound")}, 
     {HttpStatusCode.Unauthorized, new RazorHandler("/unauthorized")}, 
    } 

當我訪問一個/stars文件夾裏面的東西是不存在的:

/stars/asdf/xyz

它首先檢查爲/stars/asdf/default.cshtml。然後前往stars/default.cshtml並加載具有default頁面的任何級別。所以,只有當/stars根文件夾根本不存在時,纔會加載/notfound

/asdf/xyz不存在時,是否可以要求它加載/notfound

這是根目錄下的行爲:

http://localhost:2000/asdf將帶你到/notfound。但是,它不會在文件夾下執行此操作。

Tnank you。

編輯--------------------------------------------- ---------

其實我發現,如果我去到不好的URL /stars/asdf/stars地方沒有默認值,但根/default.cshtml實際存在,在這種情況下,無論是/notfound - >/default裝載了一個之後?!?

我的設置是錯誤的? SS故障?

回答

1

ServiceStack的路由優先級如下。 ServiceStack調用ServiceStackHttpHandlerFactory.GetHandler以獲取當前路由的處理程序。

ServiceStackHttpHandlerFactory.GetHandler回報:

  1. 匹配RawHttpHandler,如果有的話。
  2. 如果域根,如果有的話返回的處理程序GetCatchAllHandlerIfAny(...),
  3. 如果路由匹配元數據uri,則相關處理程序(如果有)。
  4. 處理程序返回ServiceStackHttpHandlerFactory.GetHandlerForPathInfo(如果有)。
  5. NotFoundHandler。

ServiceStackHttpHandlerFactory.GetHandlerForPathInfo回報:

  1. 如果url一個有效的REST路由匹配,新RestHandler。
  2. 如果url現有的文件或目錄相匹配,則返回
    • 通過GetCatchAllHandlerIfAny(...),如果有返回的句柄。
    • 如果它是支持的文件類型,則爲StaticFileHandler,
    • 如果它不是受支持的文件類型,則爲ForbiddenHttpHandler。
  3. 處理程序返回GetCatchAllHandlerIfAny(...),(如果有的話)。
  4. null。

CatchAllHandlers數組包含評估url的函數並返回一個處理程序或null。數組中的函數按順序調用,並且第一個不返回空值的函數處理該路由。

控制默認文件是否被提供的代碼是StaticFileHandler的一部分。它只需要調用現有的文件和目錄。

這裏的培訓相關fragement:

foreach (var defaultDoc in EndpointHost.Config.DefaultDocuments) 
{ 
    var defaultFileName = Path.Combine(fi.FullName, defaultDoc); 
    if (!File.Exists(defaultFileName)) continue; 
    r.Redirect(request.GetPathUrl() + '/' + defaultDoc); 
    return; 
} 

正如你可以看到,如果默認文件沒有在要求的目錄中找到,它重定向了目錄鏈,直到找到一個默認的文件服務。如果您需要更改此行爲,可以通過添加您編碼的CatchAllHander來覆蓋它。關於編寫一個CatchAllHandler的更多細節可以在我對一個相關問題的回答中找到,在這裏:https://stackoverflow.com/a/17618851/149060