ASP.NET MVC路由到Intranet页面

时间:2012-03-15 13:03:28

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

我对ASP.NET MVC有一个看似奇怪的问题。

我们为Customer X构建了一个网站,并将其部署在他们的服务器上。第一个问题是它位于新型访问管理器之后,因此对页面的所有请求都会通过:

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助手并在“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的路由放回到顶部才能再次工作,但现在静态链接不再起作用了。

任何想法?

2 个答案:

答案 0 :(得分:0)

添加https://否则IIS会从您网站的根目录

中查找此资源

答案 1 :(得分:0)

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

我通过首先放入传入的绑定来做到这一点(因为你无法真正强制传入特定路线)。对于传出链接,我使用Html.RouteLink,我可以指定我想使用哪条路线而不管它的位置。