2008-11-17 4 views
10

Wir ASP.NET auf einen benutzerdefinierten REST Handler, der so konfiguriert ist, um alle eingehenden Anforderungen verarbeiten:ASP.NET URL Validierung

<add path="*" verb="*" type="REST.RESTProtocolHandler"/> 

Es ist jedoch ein Pipezeichen Geben, richtig codiert oder gar nicht , löst einen Validierungsfehler aus, der scheinbar aus ASP.NET stammt.

Zugriff http://localhost:8080/%7c oder http://localhost:8080/| ergibt diesen Fehler:

[ArgumentException: Illegal characters in path.] System.IO.Path.CheckInvalidPathChars(String path) +7489125 System.IO.Path.Combine(String path1, String path2) +40 System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path, VirtualDirectoryMapping mapping) +114 System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, VirtualPath path, String& directory, String& baseName) +72 System.Web.Configuration.UserMapPath.MapPath(String siteID, VirtualPath path) +30 System.Web.Configuration.UserMapPath.MapPath(String siteID, String path) +31 System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +297 System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath, Boolean permitNull) +51 System.Web.CachedPathData.GetConfigPathData(String configPath) +341 System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +110 System.Web.HttpContext.GetFilePathData() +36 System.Web.HttpContext.GetConfigurationPathData() +26 System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context) +43 System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context, Boolean canThrow) +41 System.Web.HttpResponse.ReportRuntimeError(Exception e, Boolean canThrow, Boolean localExecute) +101 System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, HttpContext context, Exception e) +383

Kein Userland-Code ausgeführt wird. Ist das irgendwo eine Konfigurationsoption? Reproduziert auf IIS 7 & VS Studio 2008 devel Server.

Stack Overflow scheint diesen Fehler zu beheben OK, es sieht so aus, als ob eine dynamisch generierte 404 MVC-Seite für https://stackoverflow.com/%7c gerendert wird.

Irgendwelche Ideen?

Antwort

-1

Standardmäßig lässt IIS bestimmte Zeichen in der URL nicht zu und betrachtet sie als illegal. Hier kommt das Problem her - es ruft nicht einmal den Handler an, den Sie haben. Soweit ich weiß, gibt es keinen Ort, an dem Sie konfigurieren können, welche Zeichen über die Benutzeroberfläche akzeptiert werden, mit Ausnahme der Windows-Registrierung. Ich weiß nicht, warum du Pfeife benutzen willst, aber ich denke nicht, dass es eine gute Übung ist. Wie für die Fehlerseite - you can always have your own error page für jede Ausnahme, so dass Benutzer die hässlichen Nachrichten nicht sehen.

+0

Wenn Sie sich http://StackOverflow.com/%7c ansehen, werden Sie sehen, dass Sie eine gerenderte Seite erhalten (Ihr Benutzername ist ein Hinweis), also muss es eine Möglichkeit geben, dies zu tun. – bh213

1

Versuchen Sie, die Ausnahme in der Global.asax-Datei abzufangen. Implementieren Sie dort (Global.asax.cs) diese Methode:

protected void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    //do whatever you want with that exception 
    //or get the url from the context, reformat and redirect 
} 
+0

Das ist, was ich dachte, als ich diesen Beitrag zum ersten Mal sah, aber als ich es verspottete, schien es nicht zu funktionieren. –

+0

Was meinst du mit "schien nicht zu funktionieren"? –

0

Ich habe ein ähnliches Programm, das alle abfängt und sie mit einem Rohr versucht, gibt mir den gleichen Fehler. Ich nehme an, es hat damit zu tun, dass IIS Pfadtests (Mappath) durchführt, bevor es weiß, wer die Anfrage behandeln soll. Ihr Handler nimmt die Wurzel (dh alle Aufrufe), aber ich nehme an, wie IIS es ist generisch.

Also ich nehme an, dass alle oder die meisten Pfadzeichen, die Sie nicht in Ihrem Dateisystem verwenden können, auf IIS-Anfrage (GET/POST) fehlschlagen.

Vielleicht kann jemand die IIS-Prüfung deaktivieren. Laut dem Fehler scheint es zu passieren, bevor Ihre web.config gelesen wird, da es versucht, die richtige Konfiguration zu finden?

Vielleicht ist es möglich, Ihre eigene Fehlerseite als Redirect zurück zu Ihrem Handler zu verwenden ?

0

Ich denke, die Antwort ist in Ihrem Stack-Trace. Der Fehler wird auf dem System.IO.Path ausgelöst.CheckInvalidPathChars() -Aufruf - dies überprüft nicht die URL, sondern das Windows-Dateisystem, auf dem IIS sitzt. Es ist nicht so sehr der Fall, dass der Pipe-Charakter Url illegal ist, sondern grundsätzlich DOS illegal ist.

Wenn Sie die URL abfangen, bevor IIS versucht, den übereinstimmenden Pfad auf dem Server zu finden, erwarte ich, dass Sie mit diesem Fehler umgehen können. Das liegt wahrscheinlich daran, dass Sie eine Rewrite-Regel oder Ähnliches haben, um die URL mit unerwünschten Zeichen zu finden und neu zu schreiben.