2013-02-02 6 views
27

sto cercando di ottenere i seguenti (e simili) gli URL per lavorare nel mio progetto/WebAPI ASP.net MVC4:percorso ASP.net MVC4 WebAPI con nome-file in esso

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll 

Il percorso responsabile per questo URL è il seguente:

 config.Routes.MapHttpRoute(
      name: "Nav", 
      routeTemplate: "api/nav/{project}/{assembly}/{namespace}/{type}/{member}", 
      defaults: new { controller = "Nav", assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional } 
     ); 

Funziona bene se rimuovo il file. nel nome del file, o se aggiungo una barra dietro l'URL, ma ciò significa anche che non posso usare i metodi Url.Route ecc. L'errore che ottengo è un errore 404 generico (immagine sotto).

enter image description here

Ho provato ad aggiungere <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" /> al mio web.config, e ho anche provato ad aggiungere

<compilation debug="true" targetFramework="4.5"> 
    <buildProviders> 
    <remove extension=".dll"/> 
    <remove extension=".exe"/> 
    </buildProviders> 
</compilation> 

E nessuno di esso sembra funzionare. Quindi la mia domanda è fondamentalmente, come posso far funzionare questo URL e mapparlo correttamente?

+0

Solo l'ultima parte di un percorso può essere facoltativa. Nell'esempio che hai mostrato hai fatto tutti i parametri del percorso tranne il progetto opzionale che ovviamente non è possibile. Inoltre nell'URL hai mostrato che mancano porzioni 'namespace' e' type' dell'URL. Solo la porzione 'member' può essere opzionale perché è definita alla fine del percorso. –

+0

Questo non è vero, e ha dimostrato di funzionare senza problemi. Puoi avere tutte le parti opzionali che vuoi. Per esempio, anche prima della modifica che ho appena fatto nella mia risposta, l'url '/ api/nav/SpotiFire' ha funzionato come un incantesimo. – Alxandr

risposta

42

si potrebbe aggiungere il seguente gestore alla sezione <handlers> del <system.webServer>:

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/> 

Ciò renderà disponibili tutte le richieste contenenti .dll attraverso la pipeline gestita. Notate anche come li ho limitati solo al verbo GET per limitare l'impatto sulle prestazioni.

+0

Brillante, il pensiero non dovrebbe questo '' lo copro già? Non sono sicuro di cosa sia coperto da "*." – Alxandr

+2

No, non lo copre. Devi specificare l'estensione. Se c'è un'estensione nell'URL, IIS prenderà il controllo che è un file statico –

+1

+1 per mostrare il modo corretto per fare questo –

10

Trovato. Ciò che serve è questo (e forse alcune delle cose che ho aggiunto al di sopra nel post originale):

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

Non ti consiglio di aggiungere questo perché avrà un effetto collaterale negativo => tutte le richieste ora passeranno attraverso la pipeline gestita che avrà un impatto negativo sulle prestazioni della tua applicazione. –

+0

È vero, potrei trovare una soluzione migliore nel tempo, tuttavia già oltre il 90% delle richieste sono richieste gestite, quindi non credo che il successo in termini di prestazioni sarà troppo grande ... L'unica cosa che non è t caricato attraverso la pipeline gestita sono immagini, e ne ho circa 2 sulla mia intera pagina ... – Alxandr

+1

Controlla la mia risposta per il modo corretto di farlo senza attivare 'runAllManagedModulesForAllRequests =" true "'. –

0

Il mio compromesso è stato quello di aggiungere /end alla fine del percorso. Gli . vengono ignorati prima dell'ultimo /.

L'URL equivalente sarebbe http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end.

Il vantaggio è che non si ottiene un impatto sulle prestazioni delle risorse.

+0

Succhia quando ottieni un voto negativo, senza motivo – kim3er

+0

Questo ha funzionato per me ed era la soluzione più semplice , anche se ho appena aggiunto un '/' alla fine. –