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 он должен автоматически добавить для меня скрытую маршрутизацию.
Запустите приложение в режиме отладки и попробуйте открыть URL-адрес localhost: 55353 / api / x в новом окне браузера. Все еще получаете 404?
@ Правильно.
@KennethK. извини, не понимаю.





Сейчас ваше приложение не знает, как создаются маршруты. 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. Хм
Вы также можете определить действие контроллера по умолчанию с помощью атрибута Action [HttpGet("")].
Вам нужно обновить свое действие:
// GET api/<controller>
[HttpGet("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
В качестве совета Почтальон - хороший инструмент для тестирования ваших запросов api, который также рекомендуется в документации .NET, см. здесь.
Также убедитесь, что у вас нет специальных настроек прокси, которые мешают вашим запросам.
Резюмируйте ПОЧЕМУ и РЕШЕНИЕ моей проблемы:
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.
Похоже, вы смешиваете соглашение и конфигурацию.