【问题标题】:ASP.NET MVC Routing to Intranet PageASP.NET MVC 路由到 Intranet 页面
【发布时间】:2012-03-15 13:03:27
【问题描述】:

我在使用 ASP.NET MVC 时遇到了一个看似奇怪的问题。

我们为客户 X 建立了一个网站并将其部署在他们的服务器上。第一个问题是它位于 Novel Access Manager 后面,因此对页面的所有请求都会通过:

https://portal.customerx.com/intranet/tool/{这里开始我的 MVC 路线}

出于这个原因,我这样设置 Globol.asax:

 routes.MapRoute(
            "SubfolderZielsetzung", // Route name
            "intranet/tool" + "{controller}/{action}/{objectOneId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
        );

现在的请求是我在主页上添加一个超链接到他们的 Intranet 中的静态网站:

https://portal.customerx.com/asdf/foo/bar/1337/test-1

如果我只是在主页中添加以下 HTML 标记:

<a href="https://portal.customerx.com/asdf/foo/bar/1337/test-1">Support</a>

所以现在奇怪的事情来了。这是将从引擎渲染的内容:

<a href="https://portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1">

由于某种原因,我无法得到答案,即使我没有使用任何 Html Helpers 并在“https://portal.customerx.com/”之后设置 URL 前缀,路由引擎也会更改我的超链接

编辑

我昨天写道,我找到了答案,但事实证明它也不是答案。

我在 Global Asax 的顶部放置了以下路线作为本文的提示: Asp.net MVC and redirect to External site

    routes.MapRoute(
            "RedirectSiteRoute",
            "{site}",
            new {  },
            new { site = new SiteRouteConstraint() }
        );

和:

public class SiteRouteConstraint : IRouteConstraint
{
    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {

    string[] allowedSites = new[] { "https://portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1" };
    return allowedSites.Any(x => x == values[parameterName].ToString());

    }
}   

然后我将所有带有 URL 前缀的路由移动到全局 asax 的底部,所以现在我所有没有 URL_Prefix 的路由都在顶部。

这就是它的样子:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(
            "RedirectSiteRoute",
            "{site}",
            new {  },
            new { site = new SiteRouteConstraint() }
        );

        routes.MapRoute(
            "Grundauftrag", // Route name
            "{controller}/{action}/{objectOneId}/{objectTwoId}/{objectThreeId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId", objectThreeId = "objectThreeId" } // Parameter defaults
        );

        routes.MapRoute(
            "Zielsetzung", // Route name
            "{controller}/{action}/{objectOneId}/{objectTwoId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId" } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{objectOneId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
        );

        routes.MapRoute(
            "SubfolderGrundauftrag", // Route name
            Const.URL_PREFIX + "{controller}/{action}/{objectOneId}/{objectTwoId}/{objectThreeId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId", objectThreeId = "objectThreeId" } // Parameter defaults
        );

        routes.MapRoute(
            "SubfolderZielsetzung", // Route name
            Const.URL_PREFIX + "{controller}/{action}/{objectOneId}/{objectTwoId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId", objectTwoId = "objectTwoId" } // Parameter defaults
        );

        routes.MapRoute(
            "Subfolder", // Route name
            Const.URL_PREFIX + "{controller}/{action}/{objectOneId}", // URL with parameters
            new { controller = "Home", action = "Index", objectOneId = "objectOneId" } // Parameter defaults
        );

    }

在客户平台上,静态链接可以正常工作。但是现在我页面中的所有其他链接都不再起作用了......

我必须将带有 URL_Prefix 的路由放回顶部才能让它再次工作,但现在静态链接当然不再工作了。

有什么想法吗?

【问题讨论】:

  • portal.customerx.com/intranet/tool/asdf/foo/bar/1337/test-1 - 这个结果的查看代码是什么
  • 希望我理解正确,在我的 _Layout.cshtml 页面中我有以下行:portal.customerx.com/intranet/tool/asdf/foo/bar/1337/…>
  • 不幸的是无法测试你的问题,但我开始了解问题所在。简单的解决方法是为特定的 url 放置 iis 重写规则。无论如何,我只是无法理解您如何在静态 href 中更改 url
  • 好的,你能给我推荐一篇关于它的好文章吗?
  • ASP.NET 不能更改硬编码链接,如果这就是您所说的话。您以某种方式误解了您所看到的内容。硬编码链接只是不被解释的字符。唯一的可能是响应过滤器或 http-proxy,两者都不太可能。

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

添加 https:// 否则 IIS 会从您站点的根文件夹中查找此资源

【讨论】:

  • @AlCaponi 您可以随时编辑您的问题以在最后添加解决方案
【解决方案2】:

我遇到过类似的问题,需要以不同方式绑定传入和传出路由。

我通过将传入绑定放在首位来做到这一点(因为您不能真正强制传入特定路由)。对于传出链接,我使用 Html.RouteLink 并且我可以指定要使用的路由,无论其位置如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2014-05-14
    • 2010-10-22
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多