Можно ли использовать атрибут Route только для обеспечения действительного маршрута ASP.NET Controller? - PullRequest
0 голосов
/ 22 апреля 2019

Я создал пример приложения asp.net mvc5 webapi и у меня проблема с маршрутизацией. У меня есть DummyController, который я декорировал с атрибутом [Route ("dummyset")], и я подумал, что его достаточно зарегистрировать.

    [HttpPost]
    [Route("dummyset")]
    public IHttpActionResult DummySet([FromBody] DummyModel data)
    {
    }

Однако это не работает. После добавления этого куска кода:

        routes.MapHttpRoute(
        name: "DummySET",
        routeTemplate: "api/dummy/dummyset",
        defaults: new { Controller = "Dummy", action = "DummySet", method = "POST" }
        );

в WebApiConfig.cs, все работает хорошо.

Должен ли я зарегистрировать его в этих двух местах на самом деле? Есть ли более простой способ добиться этого? Это может быть кошмаром, чтобы поддерживать это позже, когда число конечных точек увеличится до гончих.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

В ASP.NET Web API, чтобы определить, какое действие вызывать, платформа использует таблицу маршрутизации.

Этот здесь называется Маршрутизация на основе конвенции , и это требуется.

routes.MapHttpRoute(
        name: "DummySET",
        routeTemplate: "api/dummy/dummyset",
        defaults: new { Controller = "Dummy", action = "DummySet", method = "POST" }
        );

А этот называется Маршрутизация атрибутов

 [HttpPost]
 [Route("dummyset")]
 public IHttpActionResult DummySet([FromBody] DummyModel data)
 {
 }

Если вы измените вышеприведенные строки на приведенный ниже фрагмент и удалите атрибут маршрутизации, он должен работать.

routes.MapHttpRoute(
    name: "DummySET",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
0 голосов
/ 22 апреля 2019

Включить его в таблице маршрутов, как это

public class RouteConfig {

    public static void RegisterRoutes(RouteCollection routes) {            
        //enable attribute routing
        routes.MapMvcAttributeRoutes();

        // After enabling routing following lines shouldn't be needed.
        // convention-based routes
        // routes.MapRoute(
        //     name: "DummySET",
        //     routeTemplate: "api/dummy/dummyset",
        //     defaults: new { Controller = "Dummy", action = "DummySet", method = "POST" }
        // );

        //default routes
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = "" }
        );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...