Rompiendo mi cabeza para obtener enrutamiento de URL en el entorno de alojamiento de IIS 7: ASP.NET

StackOverflow https://stackoverflow.com/questions/1607930

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de implementar el enrutamiento de la URL de ASP.NET utilizando System.Web.Routing . Y esto parece funcionar bien en mi localhost, sin embargo, cuando salgo a funcionar, recibo un error 404 de IIS 7 (no se encontró el archivo). Para su información, el alojamiento utiliza Windows Server 2008 IIS7.

Creo que esto está haciendo una diferencia en el manejo del mecanismo de enrutamiento. Pero no soy capaz de averiguar qué está sucediendo exactamente. A continuación se muestran las configuraciones y los cambios que he realizado hasta ahora para que funcione y para darme un poco de crédito, funciona perfectamente bien a nivel local.

Configuración de Web.Config    
          

Y luego tengo una sección system.webserver que tiene el siguiente marcado

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="UrlRoutingModule"
               type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />

    </modules>
    <handlers>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>   

</system.webServer>

Luego, en la sección Application_Start, he definido una ruta de la siguiente manera:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes); 
}
void RegisterRoutes(RouteCollection routes)
{               
    routes.Add(
       "MyRoute",
          new Route("ProductDetail/{ProductId}/{ProductName}",
                new MyRouteHandler("~/ProductDetail.aspx")));
}

Finalmente, MyRouteHandler tiene el siguiente aspecto:

 public IHttpHandler GetHttpHandler(RequestContext requestContext)
 {
     var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
                     _virtualPath, typeof(Page));
     HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
     return display;
 }

Y en la página enrutada, estoy capturando la ID del producto de la siguiente manera

ProductId = (int)HttpContext.Current.Items["Product"];

Y este es el final de mi desastre. Y esto funciona bien a nivel local. He intentado esto por un tiempo pero no lo he logrado hasta ahora.

CUALQUIER AYUDA SERÁ APRECIADA PROFUNDAMENTE.

Gracias ...

¿Fue útil?

Solución

No estoy seguro si pudo averiguar cuál era el problema ... sin embargo, si aún está buscando una solución, puede intentar lo siguiente. Tuve que enfrentar la misma situación hace un tiempo y conseguí que funcionara utilizando las reglas de Reescritura en la configuración web para las cuales no necesitará ningún mecanismo de enrutamiento. Por lo tanto, primero le recomiendo que elimine cualquier configuración de enrutamiento que tenga y el código del archivo Global.asax también.

Luego, en la sección, puede agregar las reglas de reescritura de la siguiente manera

<rewrite>
    <rewriteMaps>
        <rewriteMap name="map1" defaultValue="(.+)"/>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for map1">
        <match url="product/(.+)/(.+)"/>
        <conditions>
            <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/>
        </conditions>
        <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/>
        </rule>
    </rules>
  </rewrite>

Si tiene problemas para entender el mecanismo de reescritura, le recomiendo que lea este artículo por Scott Guthrie.

Creo que esto debería funcionar para ti dado un entorno IIS 7.0 o 7.5.

Otros consejos

He seguido este artículo: Cómo usar enrutamiento con formularios web

Antes de encontrarlo tuve problemas en mi host compartido y ninguno localmente. Era mi web.config.

Mi host estaba usando IIS 7 con Integrated Pipeline, faltaba esto:

<handlers>
    <!---after all the others--->       
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*"
             path="UrlRouting.axd"
             type="System.Web.HttpForbiddenHandler,
             System.Web, Version=2.0.0.0,
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>

EDITAR: De acuerdo con su configuración y código, lo único que queda es verificar si tiene la dll de Enrutamiento definida en web.config y también implementada en su directorio bin:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
  Culture=neutral, 
  PublicKeyToken=31BF3856AD364E35"/>

Prueba esto en tu web.config. Trabajó para mí.

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

Solo para informar cuál fue finalmente mi solución ... en el IIS7, cambie el modo de canalización a Integrado y seguí agregando algunas líneas en web.config desde el enlace anterior ... http://msdn.microsoft.com/en-us/library/cc668202. aspx

buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top