2014-01-11 45 views
1

我試圖做一些稍微不尋常的事情,允許南希作爲渲染視圖和作爲未呈現文件如果請求返回文件。我的代碼是類似於:南希返回視圖作爲渲染的視圖或未提交的文件

public class MyModule : NancyModule 
{ 
    public MyModule() : base("/apath") 
    { 
     Get["/{Name}"] = parameters => 
      { 
       return View[parameters.Name]; 
      }; 

     Get["/{Name}/AsFile"] = parameters => 
      { 
       return Response.AsFile(parameters.Name); 
      }; 
    } 
} 

我的文件相對於應用程序根目錄存儲在/Views/apath

南希返回文件作爲視圖時完美的作品,但返回試圖服務時NOTFOUND HTTP狀態代碼它作爲一個文件。

我一直在嘗試改變傳遞給Response.AsFile的路徑,但目前還沒有運氣。

如何獲得AsFile路線的工作?

+0

如果我使用下面的「@」。\ Views \ apath \「+(字符串)參數。名稱+」.extension「,我可以獲取文件。但我希望能夠做什麼Views [],並避免需要添加擴展。 –

+0

我也研究過在引導程序中連接'StaticContentsConventions',但由於我通過顯式路由捕獲請求,它似乎不適用。 –

回答

1

南希不支持這個開箱即用,有很好的理由。

是超級可怕的約你想達到什麼樣的,如果我像一個URL中傳遞的事情:

..%2Fweb.config

我可以返回配置文件回來,讓你的連接訪問字符串,並基本上破解你的網站。

你想要做的是在數據庫或平面文件或某個可以將名稱關聯到物理文件的某種查詢表中。

名稱                   路徑                                                                   
我的貓               ../pictures/cat/my-cat.jpg  
我的狗             ../pictures/cat/my-dog。JPG

然後你可以看一下名稱,返回的文件名,然後使用你的現有代碼:

Get["/{Name}/AsFile"] = parameters => 
{ 
    var file = myFileService.GetFile(parameters.Name); 

    return Response.AsFile(file.Path); 
}; 

此外,如果文件不存在,那麼你知道它可能是一個不安全的請求,並可以告訴用戶迷路!

+0

這是有道理的。我在本地主機上運行自我託管的Nancy,因此無論如何都可以認爲客戶端可以完全訪問文件。 –