2012-02-14 20 views
34

Spero che tu possa aiutarmi con il seguente problema.ASP.NET MVC Url Route support (dot)

Sto usando ASP.NET MVC 3 su IIS7 e vorrei che la mia applicazione supportasse il nome utente con punti.

Esempio: http://localhost/john.lee

Ecco come il mio Global.asax appare come segue: (http://localhost/ {username})

routes.MapRoute(
    "UserList", 
    "{username}", 
    new { controller = "Home", action = "ListAll" } 
); 

Le applicazioni funziona quando accedo altre pagine, come http://localhost/john.lee/details ecc

Ma la pagina utente principale non funziona, vorrei che l'app funzionasse come Facebook dove è supportato lo http://www.facebook.com/john.lee.

Ho usato sotto il codice e non ha funzionato per me a tutti:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

ero in grado di utilizzare il codice qui sotto e ottenere l'applicazione di accettare i punti, ma io sicuramente non vorrebbe utilizzare sotto codice per molte ragioni diverse, per favore dimmi che c'è un modo per superare questo problema.

<modules runAllManagedModulesForAllRequests="false" /> 
+0

http://stackoverflow.com/questions/8163401/dot-symbol-in-url –

+1

ho lo stesso problema, ma in IIS 6. –

+1

non sono in grado di riprodurre il problema. Funziona per me in IIS Express (quindi dovrebbe funzionare anche in IIS 7.0+). Inoltre sembra che tu stia indicando un url del modulo '/ john.lee/details' ma in base alla definizione del tuo percorso non puoi specificare un'azione. Userà sempre l'azione 'ListAll'. Quindi il problema non è realmente legato al punto qui. Probabilmente è più sulle tue rotte. –

risposta

0

Non penso che il punto sia il problema qui. AFAIK l'unico carattere che non dovrebbe essere nel nome utente è a/

Senza vedere il percorso corrispondente a john.lee/details è difficile dire cosa non va, ma suppongo che tu abbia un'altra route che corrisponde all'URL, impedendo i dettagli dell'utente vanno dalla corrispondenza corretta.

Si consiglia di utilizzare uno strumento come Glimpse per capire quale percorso è stato abbinato.

56

Aggiungere un UrlRoutingHandler a web.config. Ciò richiede tuttavia che il tuo url sia un po 'più specifico (ad esempio /Users/john.lee). Questo costringe ogni url che comincia per/utenti di essere trattato come un URL MVC:

<system.webServer>  
    <handlers>  
    <add name="UrlRoutingHandler" 
     type="System.Web.Routing.UrlRoutingHandler, 
       System.Web, Version=4.0.0.0, 
       Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" 
     path="/Users/*" 
     verb="GET"/>  
    </handlers> 
</system.webServer> 
+0

Avevo bisogno di questo per il mio controller api e funzionava come un fascino! – batzen

+0

Soluzione molto elegante. Grazie! –

+0

Grazie! Sono stato in grado di usarlo per risolvere http://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc-and-iis e http://stackoverflow.com/ questions/9331516/asp-net-mvc-routing-add-html-extension-to-routes – user1454265

4

Basta aggiungere questa sezione per Web.config, e tutte le richieste al percorso/{*} pathinfo saranno trattati dal specificato gestore, anche quando ci sono punti in pathInfo. (Tratto da ServiceStack MVC esempio Host Web.config e questa risposta https://stackoverflow.com/a/12151501/801189)

Questo dovrebbe funzionare sia per IIS 6 & 7. Si può assegnare gestori specifici per strade diverse dopo il 'percorso' con pista modificando = "*" in 'aggiungi' elementi

<location path="route"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" /> 
     </httpHandlers> 
    </system.web> 
    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" /> 
     </handlers> 
    </system.webServer> 
    </location> 
+2

Questo sembra funzionare bene come usare System.Web.Routing.UrlRoutingHandler - Non sono sicuro che sia migliore o più efficiente - UrlRoutingHandler sembra essere specificamente orientato verso il routing. – Ripside

+0

Quindi qualcuno potrebbe spiegare qual è la differenza effettiva tra TransferRequestHandler e UrlRoutingHandler? Quale di loro dovrebbe essere preferito? – Sergey

+0

Qualcuno usa ancora lo stack IIS7 nel 2017 !? .NET Core e Kestrel sono molto meglio! –

Problemi correlati