MapPageRoute routeUrl получает 403 по конкретному запросу

В настоящее время я использую global.asax для маршрутизации моей страницы на моем веб-сайте.

За исключением того, что у меня есть следующий код:

//Home:
routes.MapPageRoute("intro", String.Empty, "~/Default.aspx");
routes.MapPageRoute("home", "home", "~/Default.aspx");

//EHBO:
routes.MapPageRoute("ehbo-overzicht", "ehbo/overzicht",  "~/ehbo/overview.aspx");
routes.MapPageRoute("ehbo-input", "ehbo/input", "~/ehbo/input.aspx");
routes.MapPageRoute("ehbo-input-edit", "ehbo/inputedit/{itemid}", "~/ehbo/inputedit.aspx");

//Links:
routes.MapPageRoute("links", "links/links", "~/links/overview.aspx");

Однако для ссылок я хочу использовать:

//Links:
routes.MapPageRoute("links", "links", "~/links/overview.aspx");

Но это не работает для меня. Я получаю следующую ошибку: HTTP-fout 403.14 - Forbidden

Я использую аутентификацию на своей карте ehbo, но ничего больше, web.config:

<!-- Authentication -->
<authentication mode="Forms">
    <forms loginUrl="~/Login" name=".ASPXFORMSAUTH" defaultUrl="home">
    </forms>
</authentication>
<authorization>
    <allow users="*"/>
    <deny users="?" />
</authorization>

<location path="ehbo">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>

Но я не думаю, что это проблема. Потому что, если я не использую аутентификацию, я получаю ту же ошибку.

Кто-то, кто знает ответ?


person Niels    schedule 18.03.2016    source источник


Ответы (1)


Проблема вызвана тем, что путь /links, который вы пытаетесь маршрутизировать, также является физической папкой в ​​корневом каталоге вашего приложения, и в этом случае IIS предпочтет использовать обработчик статических файлов, а не обработчик маршрутизации. В этом случае запрос к /links на самом деле представляет собой список запросов контента к вашей папке /links, которые обычно ограничены по умолчанию и вызовут ошибку 403, которую вы видите. И я бы предположил, что даже если это не отрицается, это не будет тем поведением, которого вы ожидаете.

Самый простой способ обойти эту проблему — добавить это в ваш web.confg:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Это заставит запускать все модули по всем путям, что обычно может вызвать некоторый побочный эффект и, безусловно, приведет к некоторому уровню влияния на производительность всего сайта.

Более конкретный способ решения этой проблемы - указать обработчик на определенном пути (путях), в вашем случае вы можете попробовать добавить это в свой web.config system.webServer -> обработчики:

<handlers>
    <!--all other removes-->
    <add name="NameItProperly"
         path="/links"
         verb="GET,POST"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    <!--all other adds-->
</handlers>

Что заставит обработчик маршрута перейти только для этого конкретного пути /links.

person tweray    schedule 18.03.2016
comment
Спасибо за ответ! Я изменил пути в своем проекте, чтобы он больше не был физическим путем. Теперь это работает! - person Niels; 21.03.2016