C# 服务器关闭时是否可以渲染视图

C# 服务器关闭时是否可以渲染视图,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我必须在服务器关闭时渲染一个简单的视图。有一个全局筛选器,用于检查服务器连接。在过滤器内部,应执行重定向以在服务器运行时显示视图。 问题是重定向到控制器从未发生。过滤器中的代码执行了几次,然后我在浏览器中收到了太多的错误请求。 如果我重定向到图像或文本,一切正常。但是渲染视图是不可能的 全局筛选器: public override void OnActionExecuting(ActionExecutingContext filterContext) { using (var conne

我必须在服务器关闭时渲染一个简单的视图。有一个全局筛选器,用于检查服务器连接。在过滤器内部,应执行重定向以在服务器运行时显示视图。 问题是重定向到控制器从未发生。过滤器中的代码执行了几次,然后我在浏览器中收到了太多的错误请求。 如果我重定向到图像或文本,一切正常。但是渲染视图是不可能的

全局筛选器:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    using (var connection = new SqlConnection ConfigurationManager.ConnectionStrings["IncbbsConnection"].ToString()))
    {
        try
        { connection.Open(); }
        catch (SqlException)
        {
            // This works, the text shows:
            //var content = new ContentResult {Content = "Server down!", ContentType = "text/plain"};
            // filterContext.Result = content;

            // This works, the image appears:
            //filterContext.Result = new RedirectResult("~/Content/images/LoginLogo1.png");

            // doesn't perform redirect to a controller  
            filterContext.Result = new RedirectToRouteResult("ServerDown",new RouteValueDictionary(new controller = "Error", action = "ServerDownView"}));
        }

        finally
        { connection.Close(); }
    }
}

这不是问题所在吗

filterContext.Result = new RedirectToRouteResult("ServerDown",new RouteValueDictionary(new controller = "Error", action = "ServerDownView"}));
尝试将其更改为:

filterContext.Result = new RedirectToRouteResult("ServerDown",
   new RouteValueDictionary(
   new 
   {
       controller = "Error", 
       action = "ServerDownView"
   })
);
据我所知,您缺少了
{
开始标记


如果不是这样,这是一个路由问题。

RedirectToRouteResult构造函数有更多的重载,您选择的那个,您正在添加一个RouteName,这意味着,该路由必须存在

如果这是问题所在,只需删除路由名称:

filterContext.Result = new RedirectToRouteResult(
   new RouteValueDictionary(
   new 
   {
       controller = "Error", 
       action = "ServerDownView"
   })
);

这不是问题所在吗

filterContext.Result = new RedirectToRouteResult("ServerDown",new RouteValueDictionary(new controller = "Error", action = "ServerDownView"}));
尝试将其更改为:

filterContext.Result = new RedirectToRouteResult("ServerDown",
   new RouteValueDictionary(
   new 
   {
       controller = "Error", 
       action = "ServerDownView"
   })
);
据我所知,您缺少了
{
开始标记


如果不是这样,这是一个路由问题。

RedirectToRouteResult构造函数有更多的重载,您选择的那个,您正在添加一个RouteName,这意味着,该路由必须存在

如果这是问题所在,只需删除路由名称:

filterContext.Result = new RedirectToRouteResult(
   new RouteValueDictionary(
   new 
   {
       controller = "Error", 
       action = "ServerDownView"
   })
);

由于过滤器会执行多次,直到出现过多请求错误,因此问题可能在于如何注册过滤器

通过使用以下各项全局应用过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new <YourFilter>);
}
这样,如果您已经在
ErrorController
中,就不会重定向

我想指出的另一件事是,以这种方式使用
ActionFilter
可能不是最佳的解决方案。我认为您希望您的服务器大部分时间都处于联机状态。但是,此代码将在每个操作上运行。您可以实现一个过滤器,而不是使用
ActionFilter
。该过滤器只会当实际发生某件事时运行。在异常筛选器中,您可以检查异常的原因,如果检测到服务器停机,请重定向到
错误
控制器

更新 在对如何排除全局筛选器进行了一些研究之后,我发现了以下博文:


Phil Haack介绍了如何添加自定义的
IFilterProvider
,当您在
错误控制器上时,它不会返回您的筛选器。这是一个非常好的实现,您可以控制筛选器是否应用于实际筛选器之外。

因为您的筛选器会执行多次,直到收到过多的请求错误,问题可能在于如何注册筛选器

通过使用以下各项全局应用过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new <YourFilter>);
}
这样,如果您已经在
ErrorController
中,就不会重定向

我想指出的另一件事是,以这种方式使用
ActionFilter
可能不是最佳的解决方案。我认为您希望您的服务器大部分时间都处于联机状态。但是,此代码将在每个操作上运行。您可以实现一个过滤器,而不是使用
ActionFilter
。该过滤器只会当实际发生某件事时运行。在异常筛选器中,您可以检查异常的原因,如果检测到服务器停机,请重定向到
错误
控制器

更新 在对如何排除全局筛选器进行了一些研究之后,我发现了以下博文:


Phil Haack介绍了如何添加自定义的
IFilterProvider
,当您在
错误控制器上时,它不会返回您的过滤器。这是一个非常好的实现,您可以控制过滤器是否应用于实际过滤器之外。

好的。您是否将过滤器应用于错误控制器?如果您已将其应用于对于所有控制器,过滤器将在每次调用操作时运行,因此每次都会检查,即使是错误控制器的操作…J.Steen在这一次可能是正确的。它可能会导致堆栈溢出…可能不是堆栈溢出,因为当它这样做时,它会将请求转交给新线程,但肯定是递归的redirect.=)那么你的意思是,当它进入错误控制器时,它会再次运行&再次运行?有没有办法从控制器中排除全局筛选器?好的。你是否已将筛选器应用于错误控制器?如果你已将其全局应用于所有控制器,则筛选器将在对操作的每次调用上运行,从而每次都会进行检查,即使在e Error controller的操作…J.Steen在这一点上可能是正确的。它可能会产生堆栈溢出…可能不是堆栈溢出,因为当它这样做时,它会将请求传递给一个新线程,但肯定是一个递归重定向。=)那么你说的是,当它进入Error controller时,它会再次运行&再次运行?有没有排除glo的方法来自控制器的bal过滤器?公平地说,那一行甚至没有编译,所以我只是认为这是OP部分复制粘贴的一个错误。我也这么认为,但这对我来说是唯一明显的问题。有时像这样的小错误是showsupper。好吧。这也可能是因为我在对这个问题的第一次评论中写的。他说他已经申请了它是全局性的,所以它也适用于ErrorController…它与“太多请求”的症状相匹配,即递归重定向。=)是的,我刚刚读了你的评论,这也是很有道理的,它可能会导致无休止的递归。公平地说,那一行甚至没有编译,所以我只是认为这是OP的复制粘贴部分的一个错误。我的想法也是,但这是我唯一明显的问题。有时像这样的小错误是showsupper。好吧,它是也可能是因为我在第一次对这个问题的评论中所写的。他说他已经在全球范围内应用了它,所以它也适用于ErrorController…它符合“太多请求”的症状,即