2009-10-22 2 views
10

Sto cercando di implementare il routing URL di ASP.NET utilizzando il System.Web.Routing. E questo sembra funzionare bene sul mio localhost, tuttavia quando vado a vivere sto ricevendo un errore 404 di IIS 7 (File non trovato). FYI l'hosting utilizza Windows Server 2008 IIS7.Rompere la testa per ottenere il routing Url nell'ambiente di hosting IIS 7: ASP.NET

Penso che questo stia facendo una certa differenza nella gestione del meccanismo di routing. Ma non sono in grado di capire che cosa sta succedendo esattamente. Di seguito sono riportate le impostazioni e le modifiche che ho apportato finora per farlo funzionare e per dare un po 'di 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> 

Poi nella sezione Application_Start ho definito una via 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 appare 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 instradato sto afferrando il ID prodotto come segue

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

E questa è la fine del mio disordine. E questo funziona bene a livello locale. Ci ho provato per un po 'ma non ci sono riuscito finora.

QUALSIASI AIUTO SARÀ DIMENTICATO APPREZZATO.

Grazie ...

+1

avete implementato qualche regola di riscrittura? – Rony

risposta

2

Non sei sicuro di capire quale fosse il problema ... tuttavia se stai ancora cercando una soluzione, puoi provare quanto segue. Ho dovuto affrontare la stessa situazione un po 'di tempo fa e ho funzionato usando le regole di riscrittura in Web config per le quali non avrai bisogno di alcun meccanismo di routing. Quindi per prima cosa ti incoraggio a rimuovere qualsiasi impostazione di routing che potresti avere e il codice dal file Global.asax.

Poi nella sezione è possibile 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 avete difficoltà a capire il meccanismo di riscrittura vi consiglio di leggere this article da Scott Guthrie.

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

+0

yup ho capito il problema molto tempo fa e l'ho risolto usando le mappe di riscrittura stessa ... comunque grazie per la tua risposta – user153410

+0

user153410, ho lo stesso problema. Puoi suggerirti come hai risolto? – Riz

4

ho seguito questo articolo: How to: Use Routing with Web Forms

Prima ho trovato ho avuto problemi sul mio host condiviso e nessuno a livello locale. Era il mio web.config.

mio ospite stava usando IIS 7 con Pipeline integrato, 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 impostazioni e il codice, l'unica cosa rimasta è quella di controllare per vedere se avete la dll Routing definito nel web.config e anche schierato nella directory bin:

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

Ciao grazie per la risposta. Puoi dire quali modifiche hai apportato al tuo web.config. Sarebbe davvero di aiuto. – user153410

+0

Ho aggiunto ciò che ha risolto il mio problema. L'articolo è molto chiaro su come impostare il routing in base alle impostazioni dell'host. –

+0

Ciao grazie ancora per la risposta. Ho tutto in Web.Config e ho guardato l'articolo che hai suggerito. Come mai ho tutte le impostazioni necessarie in Web.Config. Non sono davvero in grado di capire perché sta facendo questo. Non so perché IIS 7 sia così complicato nell'ottenere cose semplici come questa, poiché il routing o la riscrittura URl è molto comune in questi giorni. – user153410

3

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

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

Dopo aver caricato il sito Web da dev locale a webhost, ricevevo 404 sul routing. runAllManagedModulesForAllRequests ha risolto il problema. –