在我的应用程序中,我正在检查某个配置文件是否可用,如果不是,那么我想重定向到安装页面.
对我来说,实现这一目标的最佳地点是application_start
.因为它只发生了一次.如果我办理入住手续application_start
并写信,Response.Redirect
我会得到Response is not available in this context
.
我尝试过其他的答案在堆栈溢出的重定向application_start
像HttpContext.Current.Response.Redirect
; 没有人为我工作.
我不想在a base controller
或a中执行它,filter
因为检查逻辑将针对每个请求发生.
我的目标是只检查一次,最好是应用程序启动时.
更新1
我将response.redirect添加到application_start但是得到了如下错误:
申请开始:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Response.RedirectToRoute(
new RouteValueDictionary {
{ "Controller", "Home" },
{ "Action", "about" }
});
}
Run Code Online (Sandbox Code Playgroud)
但我收到这样的错误:
在这种情况下无法获得响应.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.Web.HttpException:响应在此上下文中不可用.
如果您确实想避免在设置后为每个请求运行过滤器,那么您可以执行以下操作:
RedirectAttribute.cs(通用示例)
public class RedirectAttribute : ActionFilterAttribute
{
private readonly string _controller;
private readonly string _action;
public RedirectAttribute(string controller, string action)
{
_controller = controller;
_action = action;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.ActionName != _action ||
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != _controller)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new {controller = _controller, action = _action})
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 Global.asax.cs 上面的“FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);”
if (/*Insert logic to check if the config file does NOT exist*/)
{
//Replace "Setup" and "Index" with your setup controller and action below
GlobalFilters.Filters.Add(new RedirectAttribute("Setup", "Index"));
}
Run Code Online (Sandbox Code Playgroud)
现在,在您的用户完全完成设置后,您可以卸载应用程序域:
HttpRuntime.UnloadAppDomain();
Run Code Online (Sandbox Code Playgroud)
请注意:您需要确保您的应用程序有权卸载 AppDomain。如果没有,您可以在配置文件 (AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) 上尝试 File.SetLastWriteTimeUtc(...)。这也将卸载 AppDomain。
卸载 AppDomain 将“重新启动”Web 应用程序并再次调用 Application_Start()。该过滤器不会添加到您的请求中,因为您的 if 语句将确定该应用程序已配置。
归档时间: |
|
查看次数: |
610 次 |
最近记录: |