Asp.net mvc 3 重定向(relativeUrl)重定向到IIS中的错误路径
在我的MVC3应用程序中的常规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)将我重定向
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.");
}
}