Перенаправить на действие из Application_BeginRequest в global.asax - PullRequest
25 голосов
/ 16 августа 2011

В моем веб-приложении я проверяю URL-адрес из glabal.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 и перенаправления на действие при необходимости

Ответы [ 8 ]

25 голосов
/ 11 сентября 2014

Все вышеперечисленное не сработает, вы будете в цикле выполнения метода Application_BeginRequest.

Вам необходимо использовать

HttpContext.Current.RewritePath("Home/About");
24 голосов
/ 05 октября 2011

Используйте приведенный ниже код для перенаправления

   Response.RedirectToRoute("Default");

«По умолчанию» - это название маршрута. Если вы хотите перенаправить на какое-либо действие, просто создайте маршрут и используйте это имя маршрута.

11 голосов
/ 12 мая 2016

Помимо уже упомянутых способов. Другой способ - использовать URLHelper, который я использовал в сценарии, когда ошибка произошла, и пользователь должен быть перенаправлен на страницу входа в систему:

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"));
    }
}
6 голосов
/ 16 августа 2011

Попробуйте это:

HttpContext.Current.Response.Redirect("...");
3 голосов
/ 02 июня 2015

Я делаю это так:

        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();

таким образом вы переносите контекст входящего запроса и перенаправляете его куда-то еще, не перенаправляя клиента.Таким образом, перенаправление не вызовет другой запрос BeginRequest в global.asax.

0 голосов
/ 23 мая 2016

У меня было старое приложение веб-форм, которое мне пришлось преобразовать в MVC 5, и одним из требований была поддержка возможных ссылок {old_form} .aspx. В Global.asax Application_BeginRequest я настроил оператор switch для обработки старых страниц с целью перенаправления на новые и во избежание возможного нежелательного зацикливания при проверке маршрута home / default для «.aspx» в необработанном URL-адресе запроса.

    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;

        }
    }
0 голосов
/ 23 января 2015
 Response.RedirectToRoute(
                                new RouteValueDictionary {
                                    { "Controller", "Home" },
                                    { "Action", "TimeoutRedirect" }}  );
0 голосов
/ 16 августа 2011

Вы можете попробовать это:

Context.Response.Redirect ();

Не уверен.

...