Подтвердить что ты не робот

Ошибка ASP.NET MVC WebAPI 404

У меня есть приложение веб-форм asp.net, запущенное в интегрированном режиме v4.0.

Я попытался добавить apicontroller в папку App_Code.

В Global.asax я добавил следующий код

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

Когда я попытался перейти к контроллеру в http://localhost/api/Value, я получаю ошибку 404.

URL-адрес без расширения настраивается в разделе обработчика. У меня есть формы и анонимная аутентификация для веб-сайта.

URL расширения ExtensionLess настроен для '*.'

Когда я нажимаю URL для контроллера, запрос обрабатывается StaticHandler вместо ExtensionlessUrlHandler-Integrated-4.0.

Теперь я понятия не имею, почему система выкинет ошибку, как показано на рисунке ниже. Error

4b9b3361

Ответ 1

Я столкнулся с этой проблемой.

Я пробовал редактировать мой WebApiConfig.cs, чтобы выполнить ряд рекомендаций здесь и примеры кода в другом месте. Некоторые работали, но не объяснили, почему маршрут не работал, когда WebApiConfig.cs был закодирован точно в соответствии с проектом Web-шаблона MS.

Моя фактическая проблема заключалась в том, что при добавлении вручную WebApi в мой проект я не следил за порядком заказа на конфигурацию из Global.asax

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

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

Ответ 2

Проблема заключается в вашей конфигурации маршрутизации. Маршрутизация Mvc отличается от маршрутизации WebApi.

Добавьте ссылку на System.Web.Http.dll, System.Web.Http.Webhost.dll и System.Net.Http.dll, а затем настройте свою маршрутизацию API следующим образом:

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );

Ответ 3

Обеспечьте следующее:

1.) Убедитесь, что ваш IIS настроен с .NET 4.5 или 4.0, если ваш веб-api - 4.5. 4.5 в IIS

запустите эту команду в командной строке с правами администратора

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.) Измените маршрутизацию на

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

и сделать запрос с помощью Demo/Get (где demo - имя вашего контроллера)

если 1,2 не работают, попробуйте 3

3.) Добавьте следующую конфигурацию в файл web.config

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>

Ответ 4

Кроме того, убедитесь, что ваш контроллер заканчивается именем "Контроллер", как в "PizzaPieController".

Ответ 5

Я пробовал все вышеперечисленное и имел ту же проблему. Оказалось, что пул приложений, созданный в IIS, по умолчанию -.net 2.0. Когда я изменил его на 4.0, он снова работал

Ответ 6

Спасибо Шеннон, отлично работает = >

Мой заказ в моем Global.asax был:

GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

вместо хорошего:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register); 

Ответ 7

Также попробуйте удалить весь контент папки api bin. Mine содержала старые dll (из-за большого переименования пространства имен), выставляя конфликтующие контроллеры. Эти DLL не были удалены с помощью функций Visual Studio Clean.

(Тем не менее, я нахожу, что asp.net web api серьезно не имеет маршрутизации и отладки информации на уровне отладки).

Ответ 8

Если вы создаете контроллер в App_Code, как таблица маршрутизации знает, где она находится? Вы указали маршрут как "api/{controller/...", но не там, где находится контроллер. Попробуйте переместить его в нужную папку.

Ответ 9

После нескольких часов траты времени на это я нашел решение этого в моем случае.

Это был порядок регистрации маршрутов в RouteConfig.

Мы должны регистрировать HttpRoute в таблице Route перед маршрутом контроллера по умолчанию. Это должно быть следующим. Конфигурация таблицы маршрутизации Route Config

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

    }
}

Ответ 10

Для URL-адреса, который вы пытаетесь (http://localhost/api/Value), убедитесь, что существует публичный тип с именем ValueController, который происходит от ApiController и имеет общедоступный метод с некоторыми из этих характеристик:

  • Имя метода начинается с Get (например, GetValues или просто Get).
  • В этом методе применяется атрибут HttpGet.

Если вы пытаетесь использовать код из шаблона проекта веб-API по умолчанию, имя контроллера ValuesController, а не ValueController, поэтому URL будет http://localhost/api/values.

Если это не помогает, вы можете включить трассировку, которая может дать вам полезное представление о том, где в конвейере возникает ошибка (а также почему).

Надеюсь, что это поможет.

Ответ 11

Я скопировал dll контроллера на основе RouteAttribute в папку bin, но он не распознавался как действительный контроллер, и я получал ошибку 404 на клиенте.

После большой отладки я нашел свою проблему. Это связано с тем, что версия System.Web.Http.dll, на которую ссылался контроллер, отличалась от версии System.Web.Http.dll, ссылаясь на основной проект (тот, который содержит global.asax.cs).

Asp.Net находит контроллер путем отражения с использованием кода, подобного этому

internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

Так как IHttpController отличается для каждой версии System.Web.Http.dll, контроллер и основной проект должны иметь одинаковую ссылку.

Ответ 12

У нас также было это, изменение версии .NET с 4.5 до 4.5.1 или более новая проблема была решена.

Ответ 13

Попробуйте использовать часть Value имени контроллера, например:

http://localhost/api/Value

Примечание. По соглашению, механизм маршрутизации принимает значение, переданное как имя контроллера, и добавляет к нему слово Controller. Поместив ValueController в URI, у вас появился механизм маршрутизации для класса с именем ValueControllerController, который он не нашел.

Ответ 14

Конфигурация вашего маршрута выглядит хорошо. Дважды проверьте раздел обработчиков в web.config, для интегрированного режима это правильный способ использования ExtensionLessUrlHandler:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Подробнее об этой теме: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

Ответ 15

Ни одно из решений выше не решило мою проблему... Моя ошибка заключалась в том, что я скопировал файлы bin непосредственно на рабочий сервер, а затем, я не работаю. 404 исчез, когда я опубликовал проект на диск и скопировал "опубликованную" папку на сервер. Это немного очевидно, но может помочь кому-то.

Ответ 16

Время для меня добавить мой глупый надзор в список здесь: я ошибся по пути маршрута по умолчанию для webapi.

Оригинал:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/id",
            defaults: new { id = RouteParameter.Optional}
        );

Исправлено: (наблюдайте фигурные скобки вокруг "id" )

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );

Ответ 17

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

Я обнаружил, что это произошло только сейчас в проекте, над которым я работал, только после того, как он был развернут в CI/Staging. Решение заключалось в том, чтобы переключать значение отладки компиляции = "истина" взад и вперед при развертывании каждой версии в каждую среду один раз, и она будет исправлена ​​для меня.

Ответ 18

В моем случае я забыл сделать это от ApiController.

Итак, это будет выглядеть как

public class ValuesController : ApiController

Ответ 19

Последовательность регистрации маршрута была проблемой в моем Application_Start(). последовательность, которая работала для меня, была

AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

раньше это было

AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);