Проверка URL-адреса ASP.NET

У нас есть настраиваемый обработчик REST на ASP.NET, который настроен таким образом, чтобы обрабатывать все входящие запросы:

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

Однако, передавая ему символ канала, правильно закодированный или вообще не запущенный, запускается ошибка проверки, которая, как представляется, поступает изнутри ASP.NET.

Доступ к http://localhost:8080/%7c или http://localhost:8080/| дает эту ошибку:

[ArgumentException: Незаконные символы в пути.]  System.IO.Path.CheckInvalidPathChars(String path) +7489125    System.IO.Path.Combine(String path1, String path2) +40    System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path, отображение VirtualDirectoryMapping) +114    System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, путь VirtualPath, String & directory, String & baseName) +72    System.Web.Configuration.UserMapPath.MapPath(String siteID, путь VirtualPath) +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) +43    System.Web.Configuration.CustomErrorsSection.GetSettings(контекст HttpContext, Boolean canThrow) +41    System.Web.HttpResponse.ReportRuntimeError(Exception e, Boolean canThrow, Boolean localExecute) +101    System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, контекст HttpContext, исключение e) +383

Никакой код пользователя не выполняется. Это вариант конфигурации где-то? Воспроизведено на сервере разработки IIS 7 и VS Studio 2008.

Переполнение стека, похоже, обрабатывает эту ошибку ОК, похоже, что динамически созданная страница 404 MVC получает рендеринг для https://stackoverflow.com/%7c.

Любые идеи?

Ответ 1

Попробуйте перехватить исключение в файле Global.asax. Внесите туда (Global.asax.cs) этот метод:

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
}

Ответ 2

и вуаля работает.

Но я сделал эту работу с IIS7 без проблем, но с IIS6 я получаю эту ошибку (недопустимые символы в пути).

Ответ 3

У меня есть аналогичная программа, которая перехватывает все и пытается ее с помощью канала, дает мне ту же ошибку. Я предполагаю, что это связано с IIS, выполняющим тесты пути (mappath), прежде чем он узнает, кто должен обрабатывать запрос. Ваш обработчик берет корень (что означает все вызовы), но я предполагаю, что IIS делает его общим.

Таким образом, я предполагаю, что любой или большинство шаблонов переноса, которые вы не можете использовать в вашей файловой системе, не будут выполняться при запросе IIS (GET/POST).

Возможно, кто-то знает, как отключить проверку IIS. Согласно ошибке, похоже, это происходит даже до чтения вашего web.config, поскольку он пытается найти правильную конфигурацию?,

Может быть, вы можете использовать свою собственную страницу ошибок в качестве перенаправления обратно на ваш обработчик?

Ответ 4

Я думаю, что ответ находится в вашей трассе стека. Ошибка вызывается при вызове System.IO.Path.CheckInvalidPathChars() - это не проверка URL-адреса, а проверка файловой системы Windows, на которой сидит IIS. Это не так, что характер трубы является Url незаконным, но в основном DOS незаконным.

Если вы перехватите URL-адрес, прежде чем IIS попытается найти подходящий путь на сервере, я ожидаю, что вы сможете справиться с этой ошибкой. Вероятно, это связано с тем, что правило перезаписи или аналогично найти и переписать URL с нежелательными символами в нем.

Ответ 5

По умолчанию IIS не разрешает определенные символы в URL-адресе и считает их незаконными. Здесь возникает проблема - он даже не вызывает обработчик, который у вас есть. Насколько мне известно, нет места, где вы можете настроить, какие символы принимаются через пользовательский интерфейс, за исключением реестра Windows. Я не знаю, почему вы хотите использовать трубку, но я не думаю, что это хорошая практика. Что касается страницы с ошибкой - вы всегда можете создать свою собственную страницу ошибок для любого исключения, чтобы пользователи не увидели уродливые сообщения.