Ошибка HTTP 404.0 - не найдена при действии в контроллере. MVC [дубликат]

269
задан Tadeu Maia 22 August 2012 в 23:17
поделиться

15 ответов

Я получил эту работу, отредактировав 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, когда им этого не потребуется. Эти параметры лучше всего оставить, если у вас нет конкретного случая.

339
ответ дан Amir Ismail 20 August 2018 в 23:19
поделиться

Добавить правило перезаписи 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> 
0
ответ дан Amadeus Sánchez 20 August 2018 в 23:19
поделиться

Мне удалось решить мою конкретную версию этой проблемы (нужно было сделать /customer.html route to / customer, завершение косой черты не разрешено) с помощью решения в https://stackoverflow.com/a/13082446 / 1454265 и подставляя путь = "*. Html".

22
ответ дан Community 20 August 2018 в 23:19
поделиться
  • 1
    Это то, что я имел с mvc3 + .net4.0 и работал красиво, но больше не работаю с mvc4 + .net4.5. – Tadeu Maia 21 August 2012 в 23:59
  • 2
    Остерегайтесь последствий производительности runAllManagedModulesForAllRequests (RAMMFAR). Это позволит использовать все управляемые модули для каждого запроса. Статические файлы, такие как изображения, могут обрабатываться IIS напрямую, но это обрабатывает их через каждый модуль, добавляя служебные данные для каждого запроса. – Mark 19 May 2013 в 09:26
  • 3
    @Метки. да, но я считаю, что это повлияет только на запрос маршрута / ... если мы используем & lt; location & gt; и не устанавливайте runAllManagedModulesForAllRequests в главном & lt; system.webServer & gt; раздел. – V.B. 19 May 2013 в 10:08
  • 4
    Я безуспешно пробовал расслабленноеUrlToFileSystemMapping. Я не думаю, что он работает с новейшими версиями MVC. – Mark 24 July 2013 в 11:22
  • 5
    @ V.B. Я думаю, что только обработчик достаточно, если у вас нет файлов в системе, которые соответствуют URL-адресу, который должен обрабатывать .NET. И по какой-то причине RAMMFAR не работал в & lt; location & gt; уровень, но решение обработчика. – webXL 14 August 2013 в 16:52
  • 6
    @webXL & location & gt; необходимо, когда вы не хотите, чтобы MVC обрабатывал запросы по указанному маршруту и ​​добавлял маршруты. IgnoreRoute («route / {* pathInfo}»); Затем IIS будет искать раздел местоположения & lt; путь местоположения = «маршрут» & gt; и будет использовать указанные обработчики в разделе местоположения, но он полностью обходит маршрутизацию MVC и другие шаги трубопровода MVC. В моем проекте ServiceStack api просто не работает без этой настройки. – V.B. 14 August 2013 в 17:27
  • 7
    Интересно. Учитывая, что это не сработало для вас, я собирался предположить, что это не сработает для меня ... учитывая, что я на MVC4 с .NET4.5. Но бинго, все равно. В моем случае у меня просто был URL-адрес с периодом & quot ;. & quot; как последний символ. Я получал 404, но это фиксировало это. – PandaWood 19 November 2013 в 05:15
  • 8
    Не работает на MVC 5. – Justin Skiles 3 August 2014 в 05:43
  • 9
    работает нормально без runAllManagedModulesForAllRequests . +1 – Disposer 12 December 2014 в 21:04
  • 10
    Не работает в MVC 5 :( – ppumkin 2 February 2015 в 18:15

Самый простой ответ для тех, кто имеет это только на одной веб-странице. Отредактируйте свою actionlink и + "/" в конце ее.

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
3
ответ дан demongolem 20 August 2018 в 23:19
поделиться
  • 1
    Решил это для меня! Простой и элегантный! Больше всего раздражает то, что он работает без «/» в Windows 10 во время разработки, но для Windows 2012 это, как представляется, требуется. – Wim ten Brink 14 November 2017 в 18:55

В зависимости от того, насколько важно сохранить URI без повторений, вы также можете просто передать значение с точками как часть запроса, а не URI.

Например. www.example.com/people?name=michael.phelps будет работать без изменения каких-либо настроек или чего-либо еще.

Вы теряете элегантность наличия чистого URI, но это решение не требует изменения или добавление любых настроек или обработчиков.

0
ответ дан GR7 20 August 2018 в 23:19
поделиться
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");
        }
    }
}
-3
ответ дан hamyari afarinesh 20 August 2018 в 23:19
поделиться
  • 1
    Как это отвечает на вопрос OP? Разум, описывающий это, пожалуйста? – kayess 20 December 2015 в 17:23
  • 2
    это не решение, это хак, который требует, чтобы расширение файла было помещено в путь uri (без периода), например. & Quot; ~ / Изображение / JPG / корова & Quot; для извлечения файла & quot; / app_data / images / cow / jpg & quot; - не решение этого парня и всех остальных, которые находят эти потребности. – Shaun Wilson 22 January 2016 в 00:03

Пробовал все решения выше, но ни один из них не работал для меня. Что я делал, я удалил версии .NET> 4.5, включая все его многоязычные версии; В конце концов я добавил новые (по-английски) версии по частям. В настоящее время версии, установленные в моей системе, следующие:

  • 2.0
  • 3.0
  • 3.5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

И все еще работает на эта точка. Я боюсь установить 4.6.2, потому что это может повредить все.

Поэтому я мог только предположить, что либо 4.6.2, либо все те неанглийские версии испортили мою конфигурацию.

HTH кто-то.

1
ответ дан jokab 20 August 2018 в 23:19
поделиться

Можно ли изменить структуру 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

1
ответ дан jonduncan05 20 August 2018 в 23:19
поделиться

Я застрял в этой проблеме в течение долгого времени, следуя всем различным средствам безрезультатно.

Я заметил, что при добавлении косой черты [/] в конец URL-адреса, содержащего точки [. ], он не выдал ошибку 404, и она действительно сработала.

Я, наконец, решил проблему с помощью URL-переписывателя, такого как URL-адрес URL-адреса IIS, для просмотра определенного шаблона и добавления косой черты.

Мой URL-адрес выглядит так: /Contact/~firstname.lastname, поэтому мой шаблон просто: /Contact/~(.*[^/])$

Я получил эту идею от Скотта Форсайт, см. ссылку ниже: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path

16
ответ дан Leon van Wyk 20 August 2018 в 23:19
поделиться
  • 1
    Это сработало для меня (MVC5). Другие предложения, приведенные выше, не работали, и они не были нужны, просто следящая косая черта. Я изменю свои маршруты, как было предложено здесь @ jonduncan05 здесь . – markau 5 January 2016 в 02:57
  • 2
    Спасибо, Леон. Спасла день для меня. Не уверен, что все пользователи web.config рассказывают об этом, но добавление трейлинга / было ответом, в котором я нуждался. В моем случае я контролирую серверный контроллер и javascript, который его вызывал, поэтому я просто обновил JavaScript и вуаля! – Frog Pr1nce 13 March 2017 в 11:44

Обходное решение 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/
5
ответ дан Luke 20 August 2018 в 23:19
поделиться

Поскольку решение может также рассматривать кодирование в формате, который не содержит символ ., как base64.

В js следует добавить

btoa(parameter); 

В контроллере

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);
0
ответ дан Max Mokrousov 20 August 2018 в 23:19
поделиться

Возможно, вам стоит подумать об использовании тире вместо периодов.

В 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, что может ввести в заблуждение даже разработчику, написавшему приложение.

3
ответ дан sdm350 20 August 2018 в 23:19
поделиться
  • 1
    Вероятно, это имя пользователя или другое поле, которое по сути содержит точки. Тем не менее, StackOverflow заменяет все знаки пунктуации (включая .) тире в пользовательских URL: P – jli 29 August 2012 в 21:49
  • 2
    Я столкнулся с этим, потому что у меня есть безопасная служба поиска файлов, которая явно содержит имена файлов в параметре маршрута ... – FlavorScape 3 May 2013 в 00:17
  • 3
    Продвинутый по очевидной причине: он не отвечает на вопрос. Если бы я мог, я бы не позволял периодам появляться в моем URL-адресе. Они появляются, потому что URL-адрес генерируется и должен быть удобочитаемым для человека. – mg30rg 27 February 2018 в 12:29

Кроме того, (связанный) проверяет порядок сопоставлений обработчиков. У нас был .ashx с .svc (например, /foo.asmx/bar.svc/path) в пути после него. Отображение .svc было таким образом 404 для пути .svc, который соответствовал перед .asmx. Havn't слишком много думал, но, возможно, URL-адрес, кодирующий путь, позаботится об этом.

0
ответ дан stuartm9999 20 August 2018 в 23:19
поделиться

После некоторого разговора я обнаружил, что relaxedUrlToFileSystemMapping не работает вообще для меня, то, что работало в моем случае, устанавливало RAMMFAR в true, то же самое верно для (.net 4.0 + mvc3) и (.net 4.5 + mvc4) .

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

Помните, что при установке RAMMFAR true сообщение Hanselman о RAMMFAR и производительности

42
ответ дан Tadeu Maia 20 August 2018 в 23:19
поделиться
  • 1
    – Shanker Paudel 25 September 2013 в 21:11
  • 2
    В случае с оригинальным плакатом он не нужен, так как он использует IIS7 и выше. Там это значение по умолчанию и установка RAMMFAR действительно стоит вам. См. msdn.microsoft.com/en-us/library/… – Richard 17 November 2013 в 15:18
  • 3
    Это решение для электронной почты для меня в MVC5. – ppumkin 2 February 2015 в 18:17
  • 4
    Хотя это полезно, этого было недостаточно, чтобы получить периоды, чтобы прекратить возвращать 404s в MVC5 / IIS7 для меня. – Chris Moschini 11 January 2016 в 21:36
  • 5
    отлично работает в iis express – Rakeshyadvanshi 8 March 2016 в 19:30
23
ответ дан Community 31 October 2018 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: