2017-04-20 60 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(); 
    } 
}