Маршрут web api 2 не найден
Мой конфиг маршрута выглядит так
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
У меня пользовательский контроллер разделен по действиям на отдельные файлы, поэтому все GET
операции в GetUserController.cs
файл, PUT
операции в PutUserController.cs
и так далее...
GET
Файл имеет частичный класс, как это
[RoutePrefix("api/users/{userId:Guid}/locations")]
public partial class UsersController : MyCustomApiController
{
[Route("{locationId:Guid}/list")]
[HttpPost]
public async Task<IHttpActionResult> GetUsers(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request)
{
}
}
PUT
Файл имеет частичный класс, как это
public partial class UsersController : MyCustomApiController
{
[Route("{locationId:Guid}/insert")]
[HttpPut]
public async Task<IHttpActionResult> InsertUser(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request)
{
}
}
Независимо от того, что я делаю, я всегда получаю ошибку 404. Я тестирую с помощью Почтальона Content-Type
как application/json
URL-адрес, который я использую, http://localhost:52450/api/users/3F3E0740-1BCB-413A-93E9-4C9290CB2C22/locations/4F3E0740-1BCB-413A-93E9-4C9290CB2C22/list
с POST
так как я не мог использовать GET
разместить сложный тип для первого метода
а также
http://localhost:52450/api/users/3F3E0740-1BCB-413A-93E9-4C9290CB2C22/locations/4F3E0740-1BCB-413A-93E9-4C9290CB2C22/insert
с PUT
Какие другие маршруты мне нужно настроить в конфигурации маршрута, если вообще?
РЕДАКТИРОВАТЬ
Странно, но другой контроллер, который также является частичным классом, кажется, работает с той же конфигурацией
[RoutePrefix("api/products")]
public partial class ProductController : MyCustomApiController
{
[Route("insert")]
[HttpPut]
public async Task<IHttpActionResult> InsertProduct([FromBody] InsertProductRequest request)
{
}
}
Это global.asax.cs, который соединяет все.
protected void Application_Start(object sender, EventArgs e)
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterFilters(GlobalFilters.Filters);
// Only allow Tls1.2!
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
2 ответа
Это неправильный файл конфигурации для настройки маршрутов Web API.
//global.asax.cs
GlobalConfiguration.Configure(WebApiConfig.Register); // <-- WEB API
RouteConfig.RegisterRoutes(RouteTable.Routes); // <-- MVC
Проверьте WebApiConfig.cs для настройки маршрутов веб-API.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Также ваше ограничение маршрута для Guid
неправильно. Так должно быть {parameterName:guid}
[RoutePrefix("api/users/{userId:guid}/locations")]
public partial class UsersController : MyCustomApiController {
[HttpPost]
[Route("{locationId:guid}/list")]
public async Task<IHttpActionResult> GetUsers(Guid userId, Guid locationId, [FromBody] Contracts.UserRequest request) { ... }
}
Вы можете попробовать сделать это в вашем WebApiConfig:
config.MapHttpAttributeRoutes();
var corsAttr = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(corsAttr);