2017-04-20 133 views
1

我有一個項目用.net Core mvc6編寫。我有一個「HideExeptionsMiddleware」,它的目標是捕獲控制器中未處理的拋出的異常,作爲最後的手段,並將用戶重定向到錯誤頁面。中間件還會記錄這些豁免,併爲錯誤生成唯一的ID。 我的目標是將該ID和其他「ViewBag」變量一起傳遞給Error.chtml文件,而無需重定向響應!在controllerContext之外的渲染視圖

我想要的解決方案是將.chtml文件呈現爲字符串,並使用中間件的Response.WriteAsync作爲 。

我知道它是被問過的問題,而是找到共同的解決辦法是 使用RazorEngine(https://antaris.github.io/RazorEngine/),但它在主動接縫和網上的例子/文檔是一個更老版本的,我不能讓這行得通。

它很難相信有一個簡單的解決方案,如傳遞一個路徑到chtml文件,以及模型+ viewbag和返回一個字符串。

我錯過了什麼嗎?

+0

我不太確定到底是官方的錯誤處理中間件做什麼,但它提供的能力,以*重寫*請求,這意味着它不重定向。相反,它只是用另一個URL再次執行中間件堆棧。我認爲這是你可以做的事情。這會讓你更容易,因爲你可以在查詢參數中傳遞參數並讓MVC找出它們。 – juunas

+0

更改路徑並重新調用上下文是不可能的。我收到了「頭文件已發送」的異常。但即便如此,我也不想將錯誤ID傳遞給操作。 – andrey

+0

渲染視圖需要在您的中間件中不可用的控制器上下文。我認爲'RazorEngine'是一種可行的方式。否則,不用'Razor'來製作一個簡單的html。 –

回答

3

已經有一個由ASP.NET Core提供的處理這種情況的中間件。在IApplicationBuilder實例中可以通過擴展UseStatusCodePagesWithReExecute擴展。
這個想法是使用專用於錯誤處理的路由來配置該中間件,該路由將返回配置的錯誤視圖和技術信息。

在啓動的配置方法:

... 
app.UseStatusCodePagesWithReExecute("/error/{0}"); 
... 

然後定義一個ErrorController:

[Route("error")] 
public class ErrorController : Controller 
{ 
    [HttpGet("{status?}")] 
    public IActionResult Index(int? status = null) 
    { 
     ViewBag.RequestId = HttpContext.TraceIdentifier; 
     return this.View(); 
    } 
}