从global.asax中的Application_BeginRequest重定向到某个操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从global.asax中的Application_BeginRequest重定向到某个操作相关的知识,希望对你有一定的参考价值。

在我的Web应用程序中,我正在验证来自global.asax的url。我想验证网址,如果需要,还需要重定向到某个操作。我正在使用Application_BeginRequest来捕获请求事件。

  protected void Application_BeginRequest(object sender, EventArgs e)
    {
        // If the product is not registered then
        // redirect the user to product registraion page.
        if (Application[ApplicationVarInfo.ProductNotRegistered] != null)
        {
             //HOW TO REDIRECT TO ACTION (action=register,controller=product)
         }
     }

或者是否有任何其他方法来验证每个URL,同时在mvc中获取请求并在需要时重定向到操作

答案

以上所有都不起作用你将在执行方法Application_BeginRequest的循环中。

你需要使用

HttpContext.Current.RewritePath("Home/About");
另一答案

使用以下代码进行重定向

   Response.RedirectToRoute("Default");

“默认”是路由名称。如果要重定向到任何操作,只需创建路由并使用该路由名称。

另一答案

除了已经提到的方式。另一种方法是使用URLHelper,我在场景中使用过一次错误,用户应该重定向到Login页面:

public void Application_PostAuthenticateRequest(object sender, EventArgs e){
    try{
         if(!Request.IsAuthenticated){
            throw  new InvalidCredentialException("The user is not authenticated.");
        }
    } catch(InvalidCredentialException e){
        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
        Response.Redirect(urlHelper.Action("Login", "Account"));
    }
}
另一答案

试试这个:

HttpContext.Current.Response.Redirect("...");
另一答案

我是这样做的:

        HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);

        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Home");
        routeData.Values.Add("action", "FirstVisit");

        IController controller = new HomeController();

        RequestContext requestContext = new RequestContext(contextWrapper, routeData);

        controller.Execute(requestContext);
        Response.End();

这样,您可以包装传入的请求上下文并将其重定向到其他位置,而无需重定向客户端。因此重定向不会在global.asax中触发另一个BeginRequest。

另一答案
 Response.RedirectToRoute(
                                new RouteValueDictionary {
                                    { "Controller", "Home" },
                                    { "Action", "TimeoutRedirect" }}  );
另一答案

我有一个旧的Web表单应用程序,我必须转换为MVC 5,其中一个要求是支持可能的{old_form} .aspx链接。在Global.asax Application_BeginRequest中,我设置了一个switch语句来处理旧页面以重定向到新页面,并避免在请求的原始URL中可能不希望的循环到home / default路由检查“.aspx”。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        OldPageToNewPageRoutes();
    }

    /// <summary>
    /// Provide redirects to new view in case someone has outdated link to .aspx pages
    /// </summary>
    private void OldPageToNewPageRoutes()
    {
        // Ignore if not Web Form:
        if (!Request.RawUrl.ToLower().Contains(".aspx"))
            return;

        // Clean up any ending slasshes to get to the old web forms file name in switch's last index of "/":
        var removeTrailingSlash = VirtualPathUtility.RemoveTrailingSlash(Request.RawUrl);
        var sFullPath = !string.IsNullOrEmpty(removeTrailingSlash)
            ? removeTrailingSlash.ToLower()
            : Request.RawUrl.ToLower();
        var sSlashPath = sFullPath;

        switch (sSlashPath.Split(Convert.ToChar("/")).Last().ToLower())
        {
            case "default.aspx":
                Response.RedirectToRoute(
                    new RouteValueDictionary
                    {
                        {"Controller", "Home"},
                        {"Action", "Index"}
                    });
                break;
            default:
                // Redirect to 404:
                Response.RedirectToRoute(
                    new RouteValueDictionary
                    {
                        {"Controller", "Error"},
                        {"Action", "NotFound"}
                    });
                break;

        }
    }
另一答案

你可以尝试这个:

Context.Response.Redirect();

当然可以。

以上是关于从global.asax中的Application_BeginRequest重定向到某个操作的主要内容,如果未能解决你的问题,请参考以下文章

Global.asax中的Application_Error事件不执行

为啥我在 Global.asax.cs 中的 Application_BeginRequest 没有被自托管的 WCF 服务调用

无法中断 global.asax / Application_Start

ASP.NET MVC:如何在 Global.asax.cs 中的 Application_Start() 中检测浏览器宽度

asp.net html静态文件没有触发global.asax中的Application_BeginRequest事件的解决方法

ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常