Я получил эту работу, отредактировав HTTP-обработчики моего сайта. Для моих нужд это хорошо работает и решает мою проблему.
Я просто добавил новый обработчик HTTP, который ищет конкретные критерии пути. Если запрос соответствует, он корректно отправляется в .NET для обработки. Я гораздо счастливее с этим решением, что URLRewrite взломать или включить RAMMFAR.
Например, чтобы .NET обрабатывал URL-адрес www.example.com/people/michael.phelps, добавьте следующую строку в web.config вашего сайта в элементе system.webServer / handlers
:
<add name="ApiURIs-ISAPI-Integrated-4.0"
path="/people/*"
verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
Редактировать
Есть и другие сообщения, предлагающие, что решение этой проблемы - RAMMFAR
или RunAllManagedModulesForAllRequests
. Включение этой опции позволит всем управляемым модулям для всех запросов. Это означает, что статические файлы, такие как изображения, PDF-файлы и все остальное, будут обрабатываться .NET, когда им этого не потребуется. Эти параметры лучше всего оставить, если у вас нет конкретного случая.
Добавить правило перезаписи URL в архив Web.config. Вы должны иметь [r0r] модуль перезаписи URL , уже установленный в IIS. Используйте следующее правило перезаписи как вдохновение для своего.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add trailing slash for some URLs" stopProcessing="true">
<match url="^(.*(\.).+[^\/])$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Мне удалось решить мою конкретную версию этой проблемы (нужно было сделать /customer.html route to / customer, завершение косой черты не разрешено) с помощью решения в https://stackoverflow.com/a/13082446 / 1454265 и подставляя путь = "*. Html".
Самый простой ответ для тех, кто имеет это только на одной веб-странице. Отредактируйте свою actionlink и + "/" в конце ее.
@Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
В зависимости от того, насколько важно сохранить URI без повторений, вы также можете просто передать значение с точками как часть запроса, а не URI.
Например. www.example.com/people?name=michael.phelps будет работать без изменения каких-либо настроек или чего-либо еще.
Вы теряете элегантность наличия чистого URI, но это решение не требует изменения или добавление любых настроек или обработчиков.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication1.Controllers
{
[RoutePrefix("File")]
[Route("{action=index}")]
public class FileController : Controller
{
// GET: File
public ActionResult Index()
{
return View();
}
[AllowAnonymous]
[Route("Image/{extension?}/{filename}")]
public ActionResult Image(string extension, string filename)
{
var dir = Server.MapPath("/app_data/images");
var path = Path.Combine(dir, filename+"."+ (extension!=null? extension:"jpg"));
// var extension = filename.Substring(0,filename.LastIndexOf("."));
return base.File(path, "image/jpeg");
}
}
}
Пробовал все решения выше, но ни один из них не работал для меня. Что я делал, я удалил версии .NET> 4.5, включая все его многоязычные версии; В конце концов я добавил новые (по-английски) версии по частям. В настоящее время версии, установленные в моей системе, следующие:
И все еще работает на эта точка. Я боюсь установить 4.6.2, потому что это может повредить все.
Поэтому я мог только предположить, что либо 4.6.2, либо все те неанглийские версии испортили мою конфигурацию.
HTH кто-то.
Можно ли изменить структуру URL? Для того, над чем я работал, я пробовал маршрут для
url: "Download/{fileName}"
, но он не прошел с чем-либо, у которого был a. в нем.
Я переключил маршрут на
routes.MapRoute(
name: "Download",
url: "{fileName}/Download",
defaults: new { controller = "Home", action = "Download", }
);
Теперь я могу записать localhost:xxxxx/File1.doc/Download
, и он отлично работает.
Мои помощники в представлении также взял на него
@Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})
, который также делает ссылку на формат localhost:xxxxx/File1.doc/Download
.
Возможно, вы могли бы добавить ненужное слово, например «/ view» или действие конец вашего маршрута, чтобы ваше свойство могло закончиться конечным /
чем-то вроде /mike.smith/view
Я застрял в этой проблеме в течение долгого времени, следуя всем различным средствам безрезультатно.
Я заметил, что при добавлении косой черты [/] в конец URL-адреса, содержащего точки [. ], он не выдал ошибку 404, и она действительно сработала.
Я, наконец, решил проблему с помощью URL-переписывателя, такого как URL-адрес URL-адреса IIS, для просмотра определенного шаблона и добавления косой черты.
Мой URL-адрес выглядит так: /Contact/~firstname.lastname, поэтому мой шаблон просто: /Contact/~(.*[^/])$
Я получил эту идею от Скотта Форсайт, см. ссылку ниже: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path
Обходное решение MVC 5.0.
Многие из предложенных ответов, похоже, не работают в MVC 5.0.
Поскольку проблема 404 точек в последнем разделе может быть решена путем закрытия
Сохраняя удобное место в вашем представлении:
@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)
добавьте немного jquery / javascript для выполнения задания:
<script>
$('a:contains("Change your Town")').on("click", function (event) {
event.preventDefault();
window.location.href = '@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })' + "/";
});</script>
обратите внимание на конечную косую черту, которая отвечает за изменение
http://localhost:51003/GeoData/Manage/user@foo.com
на
http://localhost:51003/GeoData/Manage/user@foo.com/
Поскольку решение может также рассматривать кодирование в формате, который не содержит символ .
, как base64.
В js следует добавить
btoa(parameter);
В контроллере
byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);
Возможно, вам стоит подумать об использовании тире вместо периодов.
В Pro ASP MVC 3 Framework они предлагают это сделать дружественные URL:
Избегайте символов, кодов и последовательностей символов. Если вам нужен разделитель слов, используйте тире (/ my-great-article). Подчеркивания недружественны, а пробелы в URL-адресах - странные (/ my + great + article) или отвратительные (/my%20great%20article).
В нем также упоминается, что URL-адреса должны быть легкими читать и изменять для людей. Возможно, причина думать об использовании тире вместо точки также поступает из одной и той же книги:
Не используйте расширения имен файлов для HTML-страниц (.aspx или .mvc), но делайте используйте их для специализированных типов файлов (.jpg, .pdf, .zip и т. д.). Веб-браузеры не заботятся о расширениях имен файлов, если вы правильно настроили MIME-тип, но люди все еще ожидают, что файлы PDF будут заканчиваться на .pdf
. Так что, хотя период остается читаемым для людей ( хотя и менее читаемый, чем тире, IMO), все равно может быть немного запутанным / вводящим в заблуждение в зависимости от того, что происходит после периода. Что делать, если кто-то имеет фамилию zip? Тогда URL будет /John.zip вместо / John-zip, что может ввести в заблуждение даже разработчику, написавшему приложение.
.
) тире в пользовательских URL: P
– jli
29 August 2012 в 21:49
Кроме того, (связанный) проверяет порядок сопоставлений обработчиков. У нас был .ashx с .svc (например, /foo.asmx/bar.svc/path) в пути после него. Отображение .svc было таким образом 404 для пути .svc, который соответствовал перед .asmx. Havn't слишком много думал, но, возможно, URL-адрес, кодирующий путь, позаботится об этом.
После некоторого разговора я обнаружил, что relaxedUrlToFileSystemMapping не работает вообще для меня, то, что работало в моем случае, устанавливало RAMMFAR в true, то же самое верно для (.net 4.0 + mvc3) и (.net 4.5 + mvc4) .
<system.webserver>
<modules runAllManagedModulesForAllRequests="true">
Помните, что при установке RAMMFAR true сообщение Hanselman о RAMMFAR и производительности