Маршрут 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) { ... }
}

Источник: Маршрутизация атрибутов в ASP.NET Web API 2

Вы можете попробовать сделать это в вашем WebApiConfig:

  config.MapHttpAttributeRoutes();
  var corsAttr = new EnableCorsAttribute("*", "*", "*");
  config.EnableCors(corsAttr);
Другие вопросы по тегам