asp.net - No se puede asignar un HttpHandler a un mapeo comodín “ruta/*”
iis-7 webdev.webserver (3)
El URLRoutingModule-4.0
es un controlador que captura todos los listados antes de su controlador nancy. Por lo tanto, entrará en juego antes de que tu controlador sea golpeado. Puedes eliminar los controladores, agregar el tuyo y volver a agregarlo así:
<handlers>
<remove name="BlockViewHandler" />
<remove name="UrlRoutingModule-4.0" />
<add verb="*" path="robots.txt" name="robots" type="System.Web.StaticFileHandler"/>
... custom handlers here
<add name="Nancy" path="api/*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
... now add back UrlRoutingModule and BlockViewHandler
<add path="*" verb="*" name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" preCondition="managedHandler" />
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
Puede ver el orden del manejador en IIS7 en Handler Mappings
seleccione View Ordered List
y mostrará el orden en el que carga los manejadores de arriba (primero) a abajo (último).
Es posible que necesite un segundo Web.config
en su carpeta /api
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<clear />
<add name="Nancy" path="*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</httpHandlers>
</system.web>
</configuration>
Del mismo modo, esto es lo que normalmente hago para el contenido "/ static" en los sitios web. No he descubierto cómo evitar la necesidad de los segundos web.config.
EDITAR
Me costó entenderlo cuando tenía que hacerlo también y parece que mi memoria no me ha servido bien. No especifico un controlador de path/*
ninguna parte, sino que tengo esto:
(solo se especifican comodines simples / rutas completamente calificadas para recorrer UrlRouting)
<location path="." inheritInChildApplications="false">
<system.webServer>
<!--
ml: in .NET 4.0 its now safe to remove from the modules section.
Make sure you have a *. mapping to a ExtensionLessUrl hanlder in IIS
this should improve performance a tad albeit neglectable.
see: http://blogs.msdn.com/b/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless-urls-without-impacting-static-requests.aspx
-->
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="false" />
<handlers>
<remove name="BlockViewHandler" />
<remove name="UrlRoutingModule-4.0" />
<add verb="*" path="robots.txt" name="robots" type="System.Web.StaticFileHandler"/>
.. Some company handlers i can''t list
<add path="*" verb="*" name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" preCondition="managedHandler" />
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</location>
Luego, en mi archivo /Content/web.config
, establezco lo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<clear />
<add name="StaticFiles" path="*" verb="*" modules="StaticFileModule" resourceType="Either" requireAccess="None" />
</handlers>
<staticContent>
<clientCache cacheControlMaxAge ="31.00:00:00" cacheControlMode="UseMaxAge" />
</staticContent>
</system.webServer>
</configuration>
Mi lista de manejadores para /Content/
ve así ahora:
Lo cual es tan seguro como puedo estar en /Content/
se servirá a través de StaticFileModule. El truco aquí parece estar especificando: inheritInChildApplications="false"
.
Así que he estado tratando de asignar un módulo http a una ruta secundaria de un sitio MVC3. Debería ser bastante simple como lo entiendo, pero no ha funcionado. El módulo se configura así:
<handlers>
<add name="Nancy" path="api/*" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</handlers>
También hay una sección coincidente para iis6, así que puedo ejecutarla en webdev.webserver. Sin embargo, al probar tanto la implementación en mi iis7 local (bajo Win7) como con webdev.webserver, solo / api llama al controlador. Si llamo / api / {anything} solo devuelve un 404.
Estoy seguro de que simplemente "lo hago mal (tm)", pero cualquier ayuda sería apreciada.
Nota: También he probado un par de otras configuraciones, incluyendo el uso de una etiqueta y la creación de una carpeta / api y la adición de un web.config a esa carpeta con un comodín completo.
Parece que el UrlRoutingModule-4.0 es más problema de lo que vale. En cambio, acabo de decirle a MVC3 que ignore las rutas. No es una solución perfecta, pero hasta que tenga algo que funcione mejor, tendré que seguir con esto en RegisterRoutes
:
routes.IgnoreRoute("api/{*route}");
Sencillo. Solo pon el camino, no hay comodín.
<handlers>
<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />
</handlers>
Esto coincidirá con:
/ api / {cualquier cosa}