"Этот ресурс не может быть найден." ошибка, когда в конце URL есть точка - PullRequest
51 голосов
/ 10 января 2009

Я использую ASP .NET MVC Beta и получаю ошибку HTTP 404 (ресурс не найден), когда я использую этот URL, в конце которого стоит "точка":

http://localhost:81/Title/Edit/Code1.

Если я удаляю точку в конце или точка находится где-то посередине, я не получаю ошибку.

Я попытался отладить, но я получаю сообщение об ошибке от «System.Web.CachedPathData.GetConfigPathData (String configPath)» перед ProcessRequest в MvcHandler.

Разрешена ли "точка" в конце URL? Или есть способ исправить определение маршрута для обработки этого URL?


Например: у меня есть таблица с именем Detail1 [Id (целое число), Code (строка), Description (строка)], которая имеет отношение FK к Master1 через столбец Id. Всякий раз, когда я выбираю запись Master1, я также выбираю ее запись Detail1, чтобы получить ее поле Код. Чтобы не выполнять это объединение каждый раз (поскольку обычно там не только одна деталь, а их больше одной), я предпочитаю не использовать столбец Id и создаю код PK для Detail1.

Но когда я избавляюсь от Id и использую Code в качестве PK, мои маршруты также начинают работать с полем Code, например: Detail1 \ Edit \ Code1

Этот код может содержать что-либо в нем или в конце, включая DOT. Есть случаи, когда я могу запретить DOT в конце, но иногда это действительно важно.

И я также видел в этом посте , что маршруты могут быть очень гибкими, поэтому я не думал, что мои такие странные.

Так вот почему я делаю что-то такое нестандартное. Есть предложения?

А также, почему так странно иметь DOT в конце URL?

Ответы [ 6 ]

53 голосов
/ 22 августа 2010

Если вы используете .NET 4.0, вы можете установить этот флаг в разделе system.web вашего web.config, и это будет разрешено:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

Я проверил это, и оно работает. Хаак имеет объяснение этого.

16 голосов
/ 11 марта 2011

Это можно решить двумя способами в каждой версии ASP.NET от 1.0 и выше. Я знаю, что прошло два года после создания этой темы, но в любом случае, вот так:

Причина

Создание собственного обработчика ошибок или настройка пользовательской страницы в IIS для перенаправления 404 не будет работать. Причина в том, что ASP.NET считает этот URL опасным. Внутри System.Web.Util.FileUtil ASP.NET вызывает закрытый метод IsSuspiciousPhysicalPath, который пытается сопоставить путь к (виртуальному, но допустимому) имени файла.

Когда результирующий легализованный путь не равен исходному пути, обработка останавливается, и код ASP.NET возвращает 404 (он не запрашивает IIS или web.config для пользовательского 404, он сам возвращает один, что делает так трудно что-то с этим делать).

Проводник Windows работает аналогично. Попробуйте создать имя файла, заканчивающееся одной или несколькими точками, т.е. test.txt.. Вы обнаружите, что полученное имя text.txt.

Решение для окончания URL в точке в ASP.NET

Решение простое (если вы его знаете, оно всегда есть). Непосредственно перед отправкой этих 404 он вызовет Application_PreSendRequestHeaders, простое событие, которое вы можете зарегистрировать в Global.asax.cs (или VB-эквивалент). Следующий код вернет браузеру простой текст, но возможен также Redirect или любой другой действительный ответ.

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{

    HttpResponse response = this.Context.Response;
    HttpRequest request = this.Context.Request;
    if (request.RawUrl.EndsWith("."))
    {
        response.ClearContent();
        response.StatusCode = 200;
        response.StatusDescription = "OK";
        response.SuppressContent = false;
        response.ContentType = "text/plain";
        response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!");
        response.End();
    }
}

Примечание: этот код также работает, когда "aspx" является , а не частью URL. Т.е., http://example.com/app/somepath. вызовет это событие. Также обратите внимание, что некоторые пути по-прежнему не будут работать (заканчивающиеся несколькими точками, хеш-тегом или, например, знаком <-sign, вызывают запрос 400-Bad). Опять же, он работает для окончания на кавычке, пробеле + косой черте или нескольких точках, разделенных пробелами. </p>

6 голосов
/ 15 ноября 2012

Ну, в .NET 4.5 я исправил эту проблему, добавив "/" в конце URL.

Итак, в вашем случае это будет "http://localhost:81/Title/Edit/Code1./". Это было единственное, что я сделал, мне не нужно было добавлять настройку httpRuntime.

2 голосов
/ 15 декабря 2016

добавить это к обработчикам

  <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
 path="api/*"
 verb="*"
 type="System.Web.Handlers.TransferRequestHandler"
 preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
0 голосов
/ 10 января 2009

Почему у вас не может быть URI с точкой в ​​конце?

Поскольку URI является запросом ресурса, а исторически несовершенный существует во всех соответствующих операционных системах, символ точки является разделителем . Последняя точка обрабатывается как обозначающая расширение файла, поэтому точка-точка не имеет смысла.

Также стоит прочитать:

0 голосов
/ 10 января 2009

Возможно, http://localhost:81/Title/Edit/Code1%2E будет работать.

Я избежал периода с помощью шестнадцатеричного кода ASCII.

...