Вызов WebAPI GET, выдача 404 not found

VS 2017, New, Project, C#, Веб-приложение ASP.NET, Пустые шаблоны ASP.NET 4.5.2.

Не отмеченная папка и ссылка для Webforms, MVC и WebAPI. Позже добавлен MS WebApi v5.4.2 через Nuget.

Папка "Контроллеры" добавлена ​​вручную.

xController.cs:

namespace v1.MyApiCallTheirApi.api
{
    public class xController : ApiController
    {
        // GET api/<controller>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
}

index.html:

<body>
    <input type = "button" value = "Go" onclick = "go()"/>
    <script type = "text/javascript">
        function go()
        {
            alert("lafdla");
            $.ajax({
                type: "GET",
                url: "/api/x", 
                success: alert("ok")
            });
        }
    </script>
</body>

Вызов $ .ajax всегда возвращает 404. Уже проверяйте это, что и многие другие. Пока я подозреваю, что для конфигурации маршрутизации может потребоваться Global.asax, но я предполагаю, что после добавления API он должен автоматически добавить для меня скрытую маршрутизацию.

Вызов WebAPI GET, выдача 404 not foundВызов WebAPI GET, выдача 404 not found

Похоже, вы смешиваете соглашение и конфигурацию.

Kenneth K. 18.04.2018 06:20

Запустите приложение в режиме отладки и попробуйте открыть URL-адрес localhost: 55353 / api / x в новом окне браузера. Все еще получаете 404?

Dilish 18.04.2018 06:36

@ Правильно.

Jeb50 19.04.2018 00:53

@KennethK. извини, не понимаю.

Jeb50 19.04.2018 00:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
151
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сейчас ваше приложение не знает, как создаются маршруты. MVC не может знать автоматически, если вы не укажете указатели, где находится каждый тип кода.

Отсюда два выхода (с использованием экземпляра GlobalConfiguration): -

a) На основе соглашения, используйте метод карты маршрута. Никакое другое место не требует дальнейших изменений.

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

б) Используйте атрибуты методов контроллера для определения фактических маршрутов. Затем добавьте атрибут маршрута для каждого метода действия.

 config.MapHttpAttributeRoutes();

За действие

[Route('api/myentity/get')
public entity GetEntity() { }

Что касается добавления пакета, он предоставляет вам только соответствующие библиотеки DLL, необходимые для WebAPI, больше не вносит изменений

считаю, что скучаю по Global.asax и роутингу. Итак, добавлено и то, и другое, что интересно, что Application_Start выполняется после моего запроса index.html на GET. Хм

Jeb50 22.04.2018 00:23

Вы также можете определить действие контроллера по умолчанию с помощью атрибута Action [HttpGet("")].

Вам нужно обновить свое действие:

// GET api/<controller>
[HttpGet("")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

В качестве совета Почтальон - хороший инструмент для тестирования ваших запросов api, который также рекомендуется в документации .NET, см. здесь.

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

DTeuchert 18.04.2018 08:14
Ответ принят как подходящий

Резюмируйте ПОЧЕМУ и РЕШЕНИЕ моей проблемы:

  1. Global.asax
  2. Регистрация API-маршрутизации через App_Start
  3. Маршруты атрибутов и соглашений нельзя смешивать вместе
  4. После перехода в Attribute вы должны объявить атрибут для каждого метода.
  5. Хотя контроллер Api может быть размещен в любом месте / папке и может называться как угодно без суффикса «Контроллер», он должен иметь суффикс «Контроллер» для класса, то есть public class v1Controller : ApiController, просто public class v1 : ApiController не будет работать.

Global.asax не является обязательным, но он похож на _init () проекта, поэтому он здесь необходим, потому что API требует маршрутизации. Независимо от того, вызывается ли этот Api внутри проекта или вне проекта, как только он попадает во встроенный App_Start init, все в проекте.

public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }

Регистрация маршрутизации API, определенная в классе, обычно в App_Start, название соглашения - WebApiConfig.

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Either this Attribute Routing
            config.MapHttpAttributeRoutes();

            // Or this conventional Routing, but not together.
            config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }

Adding a new package from Nuget won't auto-config/add necessary items to project.

MS WebApi разработан на основе MVC маршрутизации, запутался, нужен ли MVC, вот хороший чтение. Ответ: нет, вам не нужен MVC для работы с WebApi.

Другие вопросы по теме