Asp.net mvc 3 重定向(relativeUrl)重定向到IIS中的错误路径

Asp.net mvc 3 重定向(relativeUrl)重定向到IIS中的错误路径,asp.net-mvc-3,redirect,Asp.net Mvc 3,Redirect,在我的MVC3应用程序中的常规AccountController中,如果设置了returnUrl(在我的情况下,我手动设置),它将调用Redirect(returnUrl) 假设我的返回URL是/Admin/HealthCheck(实际上是这样)。当我调试时,我会得到一个类似http://localhost:3279/Admin/HealthCheck来自重定向调用 然后,我将我的应用部署到http://localhost/Test。在这种情况下,Redirect(returnUrl)将我重定向

在我的MVC3应用程序中的常规
AccountController
中,如果设置了
returnUrl
(在我的情况下,我手动设置),它将调用
Redirect(returnUrl)

假设我的返回URL是
/Admin/HealthCheck
(实际上是这样)。当我调试时,我会得到一个类似
http://localhost:3279/Admin/HealthCheck
来自重定向调用

然后,我将我的应用部署到
http://localhost/Test
。在这种情况下,
Redirect(returnUrl)
将我重定向到
http://localhost/Admin/HealthCheck
而不是预期的
http://localhost/Test/Admin/HealthCheck

这是怎么回事?如何修复此问题(如果可以修复)

下面是(标准)MVC3 AccountController的一个片段;您可以看到我从查询字符串(例如
http://localhost/Test/LogOn?ReturnUrl=/Admin/HealthCheck
,尽管是URL编码的)

(在我的情况下,我手动设置)

您还没有实际演示此手动设置是如何发生的,但是如果您硬编码了一个url,如
/Admin/HealthCheck
,而不是使用url帮助程序生成此url,如
url.Action(“HealthCheck”,“Admin”)
,不要期望奇迹发生

您的
登录
正常。它执行它应该执行的操作=>它重定向到作为参数传递的url。您的问题在于设置此url的方式


结论:在ASP.NET MVC应用程序中,处理url时始终使用url帮助程序。永远不要硬编码。

对于您的
测试
URL,您必须将
ReturnUrl
设置为
Test/Admin/HealthCheck

注意:

创建重定向到指定URL的
重定向结果
对象


换句话说,如果将
“/Admin/HealthCheck”
作为参数,这正是重定向的位置。

如果您的最终域将是
www.domain.com/Test/Admin/HealthCheck
,您可能需要更改项目的虚拟目录,以便在本地主机和实际服务器之间切换时不必更改URL

如果您使用的是Visual Studio,则可以通过在解决方案资源管理器中单击项目并点击F4来更改分配给项目的虚拟路径。这将显示“项目属性”窗口,该窗口具有更改虚拟路径的选项。在您的情况下,您需要将其更改为
/Test
。不过,您仍然需要更改URL以包含
/Test


尽管正如Darin指出的,您应该使用url帮助程序。

您需要使用Request.urlReferer.AbsoluteUri

[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        string refUri = Request.UrlReferrer.AbsoluteUri;

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return Redirect(refUri + "#/account/login");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

这没有意义,因为在IIS中,根是/Test。可能只是我,但相对URL应该是相对于应用程序根URL的。我的案例是在登录后重定向到受保护的页面。因此,用户尝试访问受保护的页面,获取登录页面,并应重定向回。我该怎么做?听起来您的方法应该是存储控制器名称、操作名称和其他参数,并在
Url.action
中使用这些参数。这似乎不对。@ashes999,如果用户试图访问受保护的页面,他会在地址栏中键入此页面地址,不是吗?当您的应用程序部署在IIS中时,他会键入
/Test/Admin/HealthCheck
,而不是
/Admin/HealthCheck
,不是吗?因为如果他输入
/Admin/HealthCheck
,他会从IIS获得404,不是吗?在这种情况下,一切正常。我不明白你的问题到底是什么。请看我对他的回答的评论。
[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        string refUri = Request.UrlReferrer.AbsoluteUri;

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return Redirect(refUri + "#/account/login");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }