1

我对 RedirectResult 的行为感到困惑——在某些情况下(使用 https),重定向似乎没有发生,但更像是转移。

如果用户尝试在未登录的情况下访问内部页面,他们将被定向到登录页面。登录后,他们被引导回我的应用程序,带有查询字符串参数

schema://host:port/myApp?returnUrl=Inspections.mvc/Edit/43523

HomeController 中处理此问题的代码会查找 redirectUrl,并执行以下操作:

        if (returnUrl != null)
        {
            return Redirect(returnUrl);                
        }

在我的开发环境和一个 QA 环境中,我看到重定向响应返回到浏览器,并按预期发出另一个请求。

但是在生产环境和另一个 QA 环境(两者都使用 https)中,最后一次重定向不会发生。浏览器继续显示url

schema://host:port/myApp?returnUrl=Inspections.mvc/Edit/43523

并显示页面 Inspections.mvc/Edit/43523 将返回的内容。

我很困惑 - 这是使用 RedirectResult 时的预期行为吗?https是相关的区别吗?

编辑:检查流量,我看到在使用 https 的环境中有一个重定向(301-永久移动),但它又回到了完全相同的地址:

schema://host:port/myApp?returnUrl=Inspections.mvc/Edit/43523

这些额外的信息让这个谜团一如既往地令人费解。

4

1 回答 1

0

查看RedirectResult 类的源代码,您可以看到它应该执行 302 或 301,具体取决于您想要的重定向类型:


public override void ExecuteResult(ControllerContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    if (context.IsChildAction)
    {
        throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
    }

    string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
    context.Controller.TempData.Keep();

    if (Permanent)
    {
        context.HttpContext.Response.RedirectPermanent(destinationUrl, endResponse: false);
    }
    else
    {
        context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);
    }
}

无论您使用什么模式,它都应该按预期工作。您是否使用诸如Fiddler之类的 http 嗅探器查看了实际的请求/响应?

也许您的浏览器出于某种原因选择不更新 URL,而问题不在于实际的重定向/重写。

于 2013-05-06T22:55:09.770 回答