2011-01-12 12 views
11

Im aggiunta di filevistacontrol alla mia applicazione Web asp.net MVC.IgnoreRoute con webservice - Escludi gli URL asmx dall'instradamento

Ho una pagina media.aspx che viene ignorato nella instradamento con

routes.IgnoreRoute("media.aspx"); 

Questo funziona con successo e serve una pagina webforms standard.

In seguito all'aggiunta di filevistacontrol, non riesco a ignorare alcuna chiamata effettuata dal controllo al suo servizio web.

Ad esempio, il seguente ignoreRoute sembra essere stato rilevato da MvcHandler.

routes.IgnoreRoute("FileVistaControl/filevista.asmx/GetLanguageFile/"); 

L'eccezione generata è:

'The RouteData must contain an item named 'controller' with a non-empty string value' 

Grazie in anticipo.

+0

quale versione di MVC stai usando? – smartcaveman

risposta

8

ho preso a lavorare con questo (una combinazione di altre risposte):

routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}"); 
+0

Mi creda: questo fallirà se il servizio web è nella root dell'applicazione. La mia risposta spiega perché fallirà e come farlo funzionare. – JotaBe

1

Hai provato:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}"); 
+0

ehi, grazie per la risposta, sì ho provato entrambi. Posso sembrare che il routing corrisponda al mio URL. Ive ha provato ad aggiungere una route per l'URL specificato e ad assegnare un gestore che genera un'eccezione ma non sembra essere gestita. Penso che abbia qualcosa a che fare con il fatto che sia un file fisico. – boz

2

Cosa succede quando si utilizza:

routes.IgnoreRoute("FileVistaControl/filevista.asmx"); 

Se questo non funziona, provare a utilizzare l'ASP.NET Routing debugger per aiutarvi a: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+0

Ora c'è qualcosa di meglio di questo debugger di route: Glimpse, che può essere scaricato come pacchetto Nuget, e consente di eseguire il debug molto più delle rotte in modo meno intrusivo. – JotaBe

2

Prova questo:

routes.IgnoreRoute("{*filevista}", new { filevista = @"(.*/)?filevista.asmx(/.*)?" }); 

Questo è basato su una raccomandazione di Phil Haack dichiarato here.

0

Sarebbe di grande aiuto se fosse stata pubblicata la fonte per la configurazione del percorso. Ho intenzione di scattare una foto al buio e dire per assicurarmi che le tue chiamate IgnoreRoute() siano tutte in cima alla tua definizione di routing.

Il modo in cui IgnoreRoute funziona consiste nel creare una route che corrisponda all'URL e ai vincoli della route ignorata e allega un StopRoutingHandler come RouteHandler. L'UrlRoutingModule sa che StopRoutingHandler significa che non deve instradare la richiesta.

Come sappiamo, i percorsi sono abbinati nell'ordine in cui sono definiti. Pertanto, se il tuo percorso {controller}/{action}/{id} viene visualizzato prima del percorso "FileVistaControl/filevista.asmx/GetLanguageFile/", corrisponderà alla rotta "{controller}/{action}/{id}".

Posso essere completamente fuori base qui, ma è difficile sapere senza vedere la vostra fonte. Spero che questo ti aiuti. E inserisci il codice sorgente! Otterrai risposte migliori.

12

Risposta breve:

routes.IgnoreRoute("{*url}", new { url = @".*\.asmx(/.*)?" }); 

Risposta lunga:

Se il servizio può essere in qualsiasi livello di un percorso, nessuna di queste opzioni funzionerà per tutti i possibili.servizi ASMX:

routes.IgnoreRoute("{resource}.asmx/{*pathInfo}"); 
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}"); 

Per impostazione predefinita, i parametri in un modello di percorso corrisponderanno fino a quando trovano una barra.

Se il parametro inizia con una stella *, come pathInfo in quelle risposte, corrisponderà a tutto, comprese le barre.

Quindi:

  • la prima risposta funzionerà solo per .asmx servizi nel percorso principale, becasuse {resource} non corrisponderà barre. (Funzionerebbe per qualcosa come http://example.com/weather.asmx/forecast)
  • il secondo funzionerà solo per i servizi .asmx che sono un livello lontano dalla radice. {directory} corrisponderà al primo segmento del percorso e {resource} il nome del servizio. (Avrebbe lavorato per qualcosa come http://example.com/services/weather.asmx/forecast)

Nessuno avrebbe funzionato per http://example.com/services/weather/weather.asmx/forecast)

La soluzione sta usando un'altra overload del metodo IgnoreRoute che consente di specificare vincoli. Usando questa soluzione puoi usare un modello semplice che corrisponde a tutti gli URL, come questo: {*url}. Quindi devi solo impostare un vincolo che controlli che l'url si riferisca a un servizio. Questo vincolo può essere espresso con un'espressione regolare come questa: .*\.asmx(/.*)?. Questo regex corrisponde a qualsiasi stringa che termina con .asmx opzionalmente seguito da una barra e qualsiasi numero di caratteri dopo di esso.

Quindi, la risposta finale è questo:

routes.IgnoreRoute("{*url}", new { url = @".*\.asmx(/.*)?" });