Подтвердить что ты не робот

ASP.net MVC4 WebApi маршрут с именем файла в нем

Я пытаюсь получить следующие (и подобные) URL-адреса для работы в моем проекте ASP.net MVC4/WebApi:

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll

Маршрут, отвечающий за этот URL-адрес, выглядит следующим образом:

        config.Routes.MapHttpRoute(
            name: "Nav",
            routeTemplate: "api/nav/{project}/{assembly}/{namespace}/{type}/{member}",
            defaults: new { controller = "Nav", assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional }
        );

Он отлично работает, если я удаляю. в имени файла или добавлении косой черты за URL-адресом, но это также означает, что я не могу использовать методы Url.Route и т.д. Ошибка, которую я получаю, является общей ошибкой 404 (изображение ниже).

enter image description here

Я попытался добавить <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" /> в свой web.config, и я также попытался добавить

<compilation debug="true" targetFramework="4.5">
  <buildProviders>
    <remove extension=".dll"/>
    <remove extension=".exe"/>
  </buildProviders>
</compilation>

И ничто из этого не работает. Итак, мой вопрос в основном, как я могу заставить этот URL работать и правильно отображать?

4b9b3361

Ответ 1

Вы можете добавить следующий обработчик в раздел <handlers> вашего <system.webServer>:

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/>

Это приведет к тому, что все запросы, содержащие .dll, будут обслуживаться через управляемый конвейер. Также обратите внимание, как я ограничил их только глаголом GET, чтобы ограничить влияние производительности.

Ответ 2

Нашел. Нужно ли это (и, возможно, некоторые из вещей, которые я добавил выше в исходном сообщении):

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

Ответ 3

Мой компромисс заключался в том, чтобы добавить /end в конец маршрута. . игнорируются до последнего /.

Эквивалентный URL-адрес будет http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end.

Преимущество состоит в том, что вы не получаете удар по производительности ваших активов.