medbouk Ответов: 1

Как я могу настроить маршрут


У меня есть этот три маршрута в моем WebApiConfig, но есть проблема, если есть {action} с тем же именем {name}. Как я могу настроить маршрут, чтобы сделать разницу между всеми (имя, идентификатор, действие, другой объект..)

Что я уже пробовал:

config.Routes.MapHttpRoute(
                        name: "ApiByName",
                        routeTemplate: "{controller}/{name}",
                        defaults: null,
                        constraints: new { name = @"^[a-z]+$" }
                    );

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

1 Ответов

Рейтинг:
2

Member 11881188

В WebApiConfig Вы можете установить столько маршрутов, сколько вам нужно,
В web APi вы можете иметь стандартный ApiController созданный контроллером MVC API, который имеет стандартные методы Rest API, как показано ниже, где я добавил еще один метод Get только для вашей демонстрации с входным параметром в качестве имени

public class TestController : ApiController
   {
       // GET: api/Test
       public IEnumerable<string> Get()
       {
           return new string[] { "value1", "value2" };
       }

       // GET: api/Test/5
       public string Get(int id)
       {
           return "value";
       }

       public string Get(string name)
       {
           return "value";
       }

       // POST: api/Test
       public void Post([FromBody]string value)
       {
       }

       // PUT: api/Test/5
       public void Put(int id, [FromBody]string value)
       {
       }

       // DELETE: api/Test/5
       public void Delete(int id)
       {
       }
   }

Для такого типа контроллера вам не требуется никаких действий и вы можете просто установить маршрут как
config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "{controller}"
      );

при вызове фактического API вам нужно передать контроллер/ Get или Post, или Put, или Delete
но если у вас есть явные методы API с вашим собственным именем, то вы должны указать имя метода как действие.
config.Routes.MapHttpRoute(
                name: "othernameApi",
                routeTemplate: "{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

точно так же вы можете иметь еще один раут, как вам требуется.
config.Routes.MapHttpRoute(
                           name: "ApiByName",
                           routeTemplate: "{controller}/{action}/{name}",
                           defaults: null,
                           constraints: new { name = @"^[a-z]+$" }
                       );

Во всех случаях вы должны иметь непустое строковое значение action, если вам нужно установить параметры для ваших собственных действий. Если вам нужно использовать стандартные методы Get, Post, Delete, Put, то вы можете иметь несколько маршрутов только с контроллерами и параметрами. ниже приведен стандартный файл webApi.config как для стандартных, так и для ваших собственных действий API
public static void Register(HttpConfiguration config)
      {
          // Web API configuration and services
          // Configure Web API to use only bearer token authentication.
          config.SuppressDefaultHostAuthentication();
          config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

          // Web API routes
          config.MapHttpAttributeRoutes();

          config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "{controller}"
                );

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

          config.Routes.MapHttpRoute(
              name: "DefaultApiwithname",
              routeTemplate: "{controller}/{name}",
              defaults: null,
              constraints: new { name = @"^[a-z]+$" }
          );

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

          config.Routes.MapHttpRoute(
                name: "customactionsApiwithname",
                routeTemplate: "api/{controller}/{action}/{name}",
                defaults: null,
                constraints: new { name = @"^[a-z]+$" }
            );
      }



Пожалуйста, дайте мне знать, если вам понадобятся дальнейшие разъяснения.