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 работать и правильно отображать?
Ответы
Ответ 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.
Преимущество состоит в том, что вы не получаете удар по производительности ваших активов.