2011-01-12 7 views
11

Im Hinzufügen der Dateivistacontrol zu meiner asp.net MVC-Webanwendung.IgnoreRoute mit Webservice - Asmx URLs vom Routing ausschließen

Ich habe eine media.aspx Seite, dass dies funktioniert erfolgreich in der Routing mit

routes.IgnoreRoute("media.aspx"); 

ignoriert und dient eine Standard-webforms Seite.

Nach dem Hinzufügen von FileVistacontrol, kann ich nicht scheinen, alle Anrufe zu ignorieren, die das Steuerelement zu seinem Webservice macht.

ZB die folgende ignoreRoute scheint immer noch von der MvcHandler abgeholt zu werden.

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

die Ausnahme ausgelöst wird:

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

Vielen Dank im Voraus.

+0

, welche Version von MVC verwenden Sie? – smartcaveman

Antwort

8

habe ich es mit dieser (einer Combo von anderen Antworten) zu arbeiten:

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

Glauben Sie mir: Dies wird fehlschlagen, wenn der Web-Service im Stamm der Anwendung ist. Meine Antwort erklärt, warum es scheitern wird und wie man es zur Arbeit bringt. – JotaBe

1

Haben Sie versucht:

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

hey, danke für die Antwort, yeah Ive hat beides versucht. Ich kann scheinen, dass das Routing für meine URL übereinstimmt. Ich habe versucht, eine Route für die angegebene URL hinzuzufügen und einen Handler zuzuweisen, der eine Ausnahme auslöst, aber anscheinend nicht behandelt wird. Ich denke, es hat etwas damit zu tun, dass es eine physische Datei ist. – boz

2

Was passiert, wenn Sie verwenden:

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

Wenn das nicht funktioniert, versuchen Sie die ASP.NET-Routing-Debugger mit Ihnen helfen: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+0

Jetzt gibt es noch etwas Besseres als diesen Routen-Debugger: Glimpse, der als Nuget-Paket heruntergeladen werden kann und es ermöglicht, weit mehr als nur Routen auf eine weniger aufdringliche Weise zu debuggen. – JotaBe

2

Versuchen Sie dies:

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

Dies basiert auf einer Phil Haack Empfehlung here.

0

Es wäre hilfreich, wenn Sie die Quelle für Ihre Routenkonfiguration gepostet haben. Ich mache eine Aufnahme im Dunkeln und sage, dass Ihre IgnoreRoute() -Aufrufe ganz oben in Ihrer Routing-Definition stehen.

Die Methode, mit der IgnoreRoute funktioniert, besteht darin, eine Route zu erstellen, die der URL und den Einschränkungen der ignorierten Route entspricht, und als RouteHandler eine StopRoutingHandler anzuhängen. Das UrlRoutingModule weiß, dass ein StopRoutingHandler bedeutet, dass die Anforderung nicht weitergeleitet werden sollte.

Wie wir wissen, werden die Routen in der Reihenfolge, in der sie definiert sind, abgeglichen. Wenn also Ihre Route {controller}/{action}/{id} vor Ihrer Route "FileVistaControl/filevista.asmx/GetLanguageFile/" angezeigt wird, entspricht sie der Route "{controller}/{action}/{id}".

Ich kann hier völlig von der Basis abweichen, aber es ist schwer zu wissen, ohne Ihre Quelle zu sehen. Hoffe das hilft. Und poste den Quellcode! Du wirst bessere Antworten bekommen.

12

Kurze Antwort:

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

Lange Antwort:

Wenn Ihr Dienst kann in beliebig sein Level eines Pfades, keine dieser Optionen wird für alle möglich funktionieren.asmx Dienste:

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

Standardmäßig werden die Parameter in einer Route Muster entsprechen, bis sie einen Schrägstrich finden.

Wenn der Parameter mit einem Stern * beginnt, wie pathInfo in diesen Antworten, wird alles übereinstimmen, einschließlich Schrägstriche.

So:

  • die erste Antwort wird nur für .asmx Dienstleistungen im Stammpfad arbeiten, becasuse {resource} nicht Schrägstriche entsprechen. (Würde für etwas wie http://example.com/weather.asmx/forecast arbeiten)
  • der zweite wird nur für .asmx Dienste funktionieren, die eine Ebene von der Wurzel entfernt sind. {directory} entspricht dem ersten Segment des Pfads und {resource} dem Namen des Dienstes. (Funktionieren würde, für so etwas wie http://example.com/services/weather.asmx/forecast)

None funktionieren würde für http://example.com/services/weather/weather.asmx/forecast)

Die Lösung wird unter Verwendung eines anderen Überlastung des IgnoreRoute Methode, die Einschränkungen zu spezifizieren. Mit dieser Lösung können Sie ein einfaches Muster verwenden, das der gesamten URL entspricht: {*url}. Dann müssen Sie nur eine Einschränkung festlegen, die überprüft, ob diese URL auf einen .asmx Dienst verweist. Diese Einschränkung kann mit einer Regex wie folgt ausgedrückt werden: .*\.asmx(/.*)?. Diese Regex entspricht einer beliebigen Zeichenfolge, die mit .asmx endet, optional gefolgt von einem Schrägstrich und einer beliebigen Anzahl von Zeichen danach.

Also, die endgültige Antwort ist diese:

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