Ошибка 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]()
Ответы
Ответ 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);