从OnActionExecuting重定向到外部URL?

时间:2015-08-26 07:41:20

标签: asp.net-mvc redirect url-redirection

我需要从OnActionExecuting方法重定向到外部网址(比如说“www.google.com”)。现在我正在使用这样的东西:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        var redirectUrl = "www.google.com";

        try
        {
            var isAjaxRequest = filterContext.HttpContext.Request.IsAjaxRequest();

            if (isAjaxRequest)
            {
                filterContext.HttpContext.Response.StatusCode = SessionController.CustomHttpRedirect;
                filterContext.HttpContext.Response.StatusDescription = redirectUrl;

                filterContext.Result = new JsonResult
                {
                    Data = new { Redirect = redirectUrl },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                filterContext.Result = new RedirectResult(redirectUrl, true);

            }

                return;
            }
            else
            {
                throw new LoggedOutException();
            }
        }
        catch
        {
            throw new LoggedOutException();
        }
    }
}

问题是它没有将我重定向到“www.google.com”,而是重定向到“http://localhost:1234/www.google.com”(我在本地试用)。 有什么方法可以解决这个问题吗? 感谢

2 个答案:

答案 0 :(得分:3)

问题很容易解决:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        var redirectUrl = "http://www.google.com";

        try
        {
            var isAjaxRequest = filterContext.HttpContext.Request.IsAjaxRequest();

            if (isAjaxRequest)
            {
                filterContext.HttpContext.Response.StatusCode = SessionController.CustomHttpRedirect;
                filterContext.HttpContext.Response.StatusDescription = redirectUrl;

                filterContext.Result = new JsonResult
                {
                    Data = new { Redirect = redirectUrl },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                filterContext.Result = new RedirectResult(redirectUrl, true);

            }

                return;
            }
            else
            {
                throw new LoggedOutException();
            }
        }
        catch
        {
            throw new LoggedOutException();
        }
    }
}

我所要做的就是当我将值分配给" redirectUrl"时,我已经把www放在http之前。如果您使用SSL连接并且您尝试从mvc重定向到另一个域,则可以放置此内容。

答案 1 :(得分:1)

而不是使用:

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "External" , ReturnURL = "www.google.com"}));

尝试以下方法:

 public class HomeController : Controller
        {
[AllowAnonymous]
         public ActionResult External(string ReturnURL){
           return Redirect(ReturnURL);
        }
    }

并在您的(主页)控制器中创建一个名为(外部)的操作,并从那里重定向到您的外部网址:

{{1}}

您无法直接从ajax响应执行服务器端重定向。但是,您可以使用新URL返回JsonResult并使用javascript执行重定向。请参阅此answer