Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何最好地实施';网站关闭';功能?_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 如何最好地实施';网站关闭';功能?

Asp.net mvc 如何最好地实施';网站关闭';功能?,asp.net-mvc,Asp.net Mvc,我们要求通过远程通知(更改数据库值)自动关闭我们的ASP.NET MVC网站。在哪里实施这一计划是最好的 基本控制器类 Global.asax 自定义属性 其他 更新 很多关于离线使用app_的建议,但是这种情况每天都会发生,而且完全是由数据库发起的,因此我宁愿让应用程序采取主动,而不是让外部的东西将文件推入 此外,我可能需要将用户重定向到一个保留页(最好是一个MVC控制器方法,以保持所有内容的一致性)。我更倾向于在我的BaseController中捕获它,并让它处理它如果您必须以编程方式执

我们要求通过远程通知(更改数据库值)自动关闭我们的ASP.NET MVC网站。在哪里实施这一计划是最好的

  • 基本控制器类
  • Global.asax
  • 自定义属性
  • 其他
更新


很多关于离线使用app_的建议,但是这种情况每天都会发生,而且完全是由数据库发起的,因此我宁愿让应用程序采取主动,而不是让外部的东西将文件推入


此外,我可能需要将用户重定向到一个保留页(最好是一个MVC控制器方法,以保持所有内容的一致性)。我更倾向于在我的BaseController中捕获它,并让它处理它

如果您必须以编程方式执行,我会使用Global.asax应用程序

您可以响应。将页面重定向到“Offline.aspx”,该页面可以从数据库或任何您需要的地方检索消息。当然,您必须查看请求,看看它是否试图访问“Offline.aspx”,否则您将陷入无限循环


或者,您的所有应用程序都可以重定向到一个网站,这样可以消除大部分复杂问题。

有一种“优雅”终止ASP.NET 2.0 webapp的标准方法-只需将一个
App_Offline.htm
放到应用程序的根目录中即可。请参阅。

对不起,我不知道ASP.NET,但如果有帮助:

我们的网站只有一个APPLICATION.ASP页面(CMS/数据库合并类型);这可能并不常见,因此可能会限制其实用性,但也可能通过在所有ASPX文件顶部添加一个INCLUDE来实现

我们将APPLICATION.ASP重命名为TEST.ASP,并将HOLDING_PAGE.ASP复制为APPLICATION.ASP

WWW文件夹中有HOLDING_PAGE.ASP,因此随时可用。它包含“站点不可用”消息等,并且对于所有CSS都是自包含的(没有包含文件,没有数据库访问)。唯一的例外是公司徽标(显然,它位于该文件的外部)

此方法阻止所有对网站的访问,不依赖于有一个工作的DB连接,并允许我们在不干扰保留页面的情况下更改网站上的任何内容(除了公司徽标,但更改可能是良性的)

我们仍然可以使用TEST.ASP在内部访问该网站,这样我们就可以在删除保留页并启用该网站之前测试任何新的卷展功能。如果要防止匿名使用TEST.ASP,请拒绝匿名权限

删除保留页是:删除APPLICATION.ASP(即保留页)并将TEST.ASP重命名为APPLICATION.ASP


我们还有一个数据库标志,它会导致normal APPLICATION.ASP页面显示一个保留页面,我们可以在进行更多细微更改时使用该页面。

我将自己回答这个问题,因为我用了不同的方式,但感谢大家的回答

我最后做的是重写BaseController类(我的所有控制器都从该类派生)中的OnActionExecuting()

在这种方法中,我检查数据库(使用1分钟缓存),如果网站关闭,我加载视图以显示关闭的消息。代码如下所示

Protected Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
            MyBase.OnActionExecuting(filterContext)

            Dim _cfgService = ObjectFactory.GetInstance(Of IConfigService)()

            If _cfgService.DynamicConfig.WebSiteClosed Then
                filterContext.Result = ErrorHandler(_cfgService.DynamicConfig.WebSiteClosedTitle, _
                                                    _cfgService.DynamicConfig.WebSiteClosedMessage)
            End If
        End Sub

在Global.asax文件中处理此类行为听起来是最好的解决方案,并重定向到静态“ofline/closed”页面。在应用程序_BeginRequest方法上处理请求,检查站点是否处于活动状态,如果允许继续,如果不是联机响应。将请求重定向到静态页面

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string redirectURL = "~/Offline.aspx";  //some static page
    bool isOnline = false;  //SQL Call, config value

    if (!isOnline && !string.IsNullOrEmpty(redirectURL))
    {
        Response.RedirectLocation = redirectURL;
        Response.End();
    }
}

不总是优雅的:我想知道Jeff(Atwood)对此是否有评论,因为我知道SO没有使用app_offline.htm方法(它包含一个图像)。关闭应用程序的请求直接来自数据库,因此app_offline实际上不是一个选项。应用程序\u BeginRequest听起来是个好主意,但我可能需要实际将用户重定向到带有消息的控制器页面,因此我不确定如何处理该场景。我更新了答案,并建议如何以编程方式执行。应用程序\u BeginRequest中的DB往返调用真的是一个可行的性能解决方案吗?让我印象深刻的是,在一个繁忙的网站上,这是一项额外的开销,99%的时间都没有价值。更好的方法是通过其他方式传达状态的变化,IMHO“这种情况每天都会发生,完全由数据库发起”,系统必须以多快的速度响应?如果(比如)1分钟就足够了,那么您可以使用一个计划任务来检查数据库标志并创建/删除app_脱机文件?或者您的正常应用程序逻辑的其他部分(例如,在获取一些其他数据库数据时,但频繁执行某些操作)可以做到这一点。对每个页面进行往返数据库调用,比如仅仅为了检查脱机标志而对每个页面进行渲染,这可能会对性能造成不利影响?正如我所说,我不擅长ASP.NET,我觉得这个建议类似于app_离线-只是你必须通过计划任务、global.asax或类似的方式来完成这些步骤。如果人们投了反对票,如果他们留下一条关于原因的评论将是有益的。