"Этот ресурс не может быть найден." ошибка, когда в конце ссылки есть точка
Я использую 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 ответов
Если вы используете.NET 4.0, вы можете установить этот флаг в разделе system.web вашего web.config, и это будет разрешено:
<httpRuntime relaxedUrlToFileSystemMapping="true" />
Я проверил это, и это работает. У Хаака есть объяснение этому.
Это можно решить двумя способами в каждой версии 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). Опять же, он работает для окончания на кавычки, пробел + косая черта или несколько точек, разделенных пробелами.
Ну, в.NET 4.5 я исправил эту проблему, добавив "/" в конце URL.
Итак, в вашем случае это будет "http://localhost:81/Title/Edit/Code1./". Это было единственное, что я сделал, мне не нужно было добавлять настройки httpRuntime.
Добавить это к обработчикам
<add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
path="api/*"
verb="*"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
Возможно http://localhost:81/Title/Edit/Code1%2E
должно сработать.
Я избежал периода с шестнадцатеричным кодом ASCII.
Почему у вас не может быть URI с точкой в конце?
Поскольку URI является запросом ресурса, и во всех соответствующих операционных системах существует исторический недостаток, поэтому символ точки является разделителем расширений. Последняя точка обрабатывается как обозначающая расширение файла, поэтому точка-точка не имеет смысла.
Также стоит прочитать: