Маршрутизация ASP.NET MVC на интранет-страницу - PullRequest
0 голосов
/ 15 марта 2012

У меня, казалось бы, странная проблема с ASP.NET MVC.

Мы создали веб-сайт для клиентов X и развернули его на своем сервере.Первая проблема заключается в том, что он находится за Novel Access Manager, поэтому все запросы к странице проходят:

https://portal.customerx.com/intranet/tool/{and здесь начинается мой маршрут для 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
        );

Теперь я попросил добавить на домашней странице гиперссылку на статический сайт, который находится в их внутренней сети:

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 и задаюПрефикс URL после "https://portal.customerx.com/"

EDIT

Вчера я написал, что нашел ответ, но, как оказалось, он тоже не был ответом.

Я поставил следующий маршрут наверху Global Asax в качестве подсказки из этой статьи: Asp.net MVC и перенаправление на внешний сайт

    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 голосов
/ 19 марта 2012

У меня были похожие проблемы, когда мне приходилось связывать входящие и исходящие маршруты по-разному.

Я сделал это, поставив сначала свои входящие привязки (так как вы не можете навязать конкретный маршрут для входящих).Для исходящей ссылки я использую Html.RouteLink и могу указать, какой маршрут я хочу использовать, независимо от его местоположения.

0 голосов
/ 15 марта 2012

добавить https: // в противном случае IIS ищет этот ресурс из корневого каталога вашего сайта

...