Rompendo la testa per ottenere il routing degli URL nell'ambiente di hosting IIS 7: ASP.NET

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

  •  05-07-2019
  •  | 
  •  

Domanda

Sto cercando di implementare il routing URL ASP.NET utilizzando System.Web.Routing . E questo sembra funzionare bene sul mio localhost ma quando vado in diretta ricevo un errore 404 di IIS 7 (File non trovato). Cordiali saluti l'hosting utilizza Windows Server 2008 IIS7.

Penso che questo stia facendo qualche differenza nella gestione del meccanismo di routing. Ma non sono in grado di capire cosa sta succedendo esattamente. Di seguito sono riportate le impostazioni e le modifiche che ho apportato finora per farlo funzionare e per dare credito a me stesso funziona perfettamente a livello locale.

Impostazioni Web.Config    
          

E poi ho una sezione system.webserver che ha il seguente markup

<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>

Quindi nella sezione Application_Start ho definito un percorso come segue:

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")));
}

Infine MyRouteHandler si presenta come segue:

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

E sulla pagina indirizzata sto afferrando l'ID prodotto come segue

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

E questa è la fine del mio casino. E questo funziona bene localmente. Ci sto provando da un po 'ma non ci sono riuscito finora.

QUALSIASI AIUTO SARÀ APPREZZATO APPROVATO.

Grazie ...

È stato utile?

Soluzione

Non sono sicuro di essere riuscito a capire quale fosse il problema ... tuttavia se stai ancora cercando una soluzione, puoi provare quanto segue. Ho dovuto affrontare la stessa situazione qualche tempo fa e l'ho fatta funzionare usando le regole di riscrittura nella configurazione Web per le quali non avrete bisogno di alcun meccanismo di routing. Quindi per prima cosa ti incoraggio a rimuovere qualsiasi impostazione di routing che potresti avere e anche il codice dal file Global.asax.

Quindi nella sezione puoi aggiungere come regole di riscrittura come segue

<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>

Se hai problemi a comprendere il meccanismo di riscrittura, ti consiglio di leggere questo articolo di Scott Guthrie.

Penso che questo dovrebbe funzionare per te dato un ambiente IIS 7.0 o 7.5.

Altri suggerimenti

Ho seguito questo articolo: Procedura: utilizzare il routing con moduli Web

Prima di trovarlo avevo problemi sul mio host condiviso e nessuno a livello locale. Era il mio web.config.

Il mio host utilizzava IIS 7 con pipeline integrata, mi mancava questo:

<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>

EDIT: in base alle tue impostazioni e al tuo codice, l'unica cosa rimasta è controllare se hai la dll di routing definita in web.config e distribuita anche nella tua directory bin:

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

Prova questo in web.config. Ha funzionato per me.

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

Giusto per informare quale fosse la mia soluzione ... su IIS7 ho cambiato la modalità pipeline in Integrata e ho seguito l'aggiunta di alcune righe sul web.config dal link sopra ... http://msdn.microsoft.com/en-us/library/cc668202. aspx

buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top