2008-11-17 25 views
10

Tenemos un controlador RESTO personalizado en ASP.NET que se configura como este para manejar todas las peticiones entrantes:ASP.NET validación de la URL

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

Sin embargo, pasándole un carácter de barra vertical, adecuadamente codificada o no en todos , desencadena un error de validación que parece provenir de ASP.NET.

Acceso http://localhost:8080/%7c o http://localhost:8080/| produce este error:

[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

Sin código de espacio de usuario es ejecutado. ¿Es esta una opción de configuración en alguna parte? Reproducido en el servidor de desarrollo 2008 de IIS 7 & VS Studio.

Stack Overflow parece manejar este error. De acuerdo, parece que una página generada dinámicamente 404 MVC se procesa para https://stackoverflow.com/%7c.

¿Alguna idea?

Respuesta

-1

De manera predeterminada, IIS no permite ciertos caracteres en la URL y los considera ilegales. Aquí es de donde viene tu problema, ni siquiera llama al manejador que tienes. Por lo que yo sé, no hay lugar en el que pueda configurar los caracteres que se aceptan a través de la interfaz de usuario, a excepción del registro de Windows. No sé por qué quieres usar tubería, pero no creo que sea una buena práctica. En cuanto a la página de error - you can always have your own error page para cualquier excepción, para que los usuarios no vean los mensajes desagradables.

+0

Si miras en http://stackoverflow.com/%7c, verás que recibes una página renderizada (tu nombre de usuario es una pista) por lo que debe haber una forma de hacerlo. – bh213

1

Intente interceptar la excepción en el archivo Global.asax. Aplicar allí (Global.asax.cs) este método:

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

Eso es lo que pensé la primera vez que vi esta publicación, pero cuando me burlé de ella no pareció funcionar. –

+0

¿Qué quieres decir con "no pareció funcionar"? –

0

Tengo un programa similar que intercepta todos y tratando con un tubo me da el mismo error. Supongo que tiene que ver con IIS haciendo pruebas de ruta (mappath) antes de saber quién debe manejar la solicitud. Su controlador toma la raíz (es decir, todas las llamadas), pero asumo que la forma en que IIS lo hace es genérico.

Supongo que cualquiera o la mayoría de los caracteres de ruta que no puede usar en su sistema de archivos fallarán en la solicitud de IIS (GET/POST).

Quizás alguien sepa cómo deshabilitar la comprobación de IIS. Según el error, parece ocurrir incluso antes de que se lea su web.config, ya que está tratando de encontrar la configuración correcta ?,

Quizás es posible usar su propia página de error como una redirección a su manejador ?

0

Creo que la respuesta está en su rastro de pila. El error se produce en System.IO.Path.Llamada CheckInvalidPathChars(): no se está verificando la URL, sino que se está verificando el sistema de archivos de Windows en el que se encuentra IIS. No se trata tanto de que el personaje de la tubería sea Url ilegal, sino básicamente DOS ilegal.

Si intercepta la URL antes de que IIS intente encontrar la ruta correspondiente en el servidor, espero que pueda solucionar este error. Probablemente eso radique en tener una regla de reescritura o similar para encontrar y reescribir la URL con caracteres no deseados.