Укажите маршрут контроллера / действия по умолчанию в WebAPI с помощью AttributeRouting

Как установить контроллер по умолчанию для использования при использовании AttributeRouting вместо RouteConfiguration по умолчанию, которую использует WebAPI. т.е. избавьтесь от закомментированного раздела кода, поскольку он избыточен при использовании AttribteRouting

    public class RouteConfig
    {
       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 }
        //);

       }
     }

Если я прокомментирую приведенный выше раздел и попытаюсь запустить приложение webapi, я получу следующую ошибку, поскольку не определен контроллер / действие по умолчанию. Ошибка HTTP 403.14 - запрещено. Веб-сервер настроен так, чтобы не отображать содержимое этого каталога.

Как я могу указать маршрут с помощью маршрутизации атрибутов для домашнего контроллера / действия?

РЕДАКТИРОВАТЬ: Пример кода:

 public class HomeController : Controller
{
    [GET("")]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Help()
    {
        var explorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
        return View(new ApiModel(explorer));
    }
}

person Abhijeet Patel    schedule 28.04.2013    source источник
comment
Поскольку вы написали, что используете AttributeRouting, не могли бы вы предоставить в своем вопросе образец кода, который показывает действие контроллера, отмеченное атрибутом AttributeRouting?   -  person Pete Klein    schedule 13.06.2013
comment
@Pete: Я обновил сообщение, включив в него образец кода   -  person Abhijeet Patel    schedule 18.06.2013


Ответы (5)


Вы пробовали следующее:

//[RoutePrefix("")]
public class HomeController : Controller
{
    [GET("")]
    public ActionResult Index()
    {
        return View();
    }
}

Это добавит маршрут в коллекцию с шаблоном URL как «» и значениями по умолчанию для контроллера и действия как «Home» и «Index» соответственно.

person Kiran Challa    schedule 28.04.2013
comment
Вышеупомянутое, похоже, не работает. Я обновил сообщение, добавив фрагмент кода - person Abhijeet Patel; 18.06.2013
comment
не могли бы вы также проверить, вызываете ли вы расширениеMapAttributeRoutes маршрутизации атрибутов? - person Kiran Challa; 18.06.2013
comment
Да в методе RegisterRoutes статического класса AttributeRoutingHttp - person Abhijeet Patel; 18.06.2013

Это сработало для меня. Добавьте это в Register() в WebApiConfig классе

config.Routes.MapHttpRoute(
                name: "AppLaunch",
                routeTemplate: "",
                defaults: new
                {
                    controller = "Home",
                    action = "Get"
                }
           );
person Sajjan Sarkar    schedule 04.02.2015

Вам необходимо установить AttributeRouting (ASP.NET MVC) вместе с AttributeRouting (ASP.NET Web API), который вы уже установили.

Пакеты MVC и веб-API - это бесплатные пакеты. Оба зависят от пакетов AttributeRouting.Core. *. AR для MVC предназначен для маршрутов в методах контроллера; AR для веб-API предназначен для маршрутов в методах ApiController.

person Pete Klein    schedule 18.06.2013
comment
Вы предлагаете установить как AttributeRouting для MVC, так и AttributeRouting для WebAPI? - person Abhijeet Patel; 20.06.2013
comment
Да, вам нужно добавить пакет MVC. Это дополнительные пакеты, оба зависят от пакетов AttributeRouting.Core. *. AR для MVC предназначен для маршрутов в методах контроллера; AR для веб-API предназначен для маршрутов в методах ApiController. (Я отредактировал свой ответ, чтобы прояснить это) - person Pete Klein; 20.06.2013

Включите маршрутизацию атрибутов в своем классе WebApiConfig, расположенном в папке App_Start, поместив следующий код:

using System.Web.Http;

namespace MarwakoService
{
      public static class WebApiConfig
      {
            public static void Register(HttpConfiguration config)
            {
                // Web API routes
                config.MapHttpAttributeRoutes();

               // Other Web API configuration not shown.
            }
       }
 }

Вы можете комбинировать с атрибутом, основанным на соглашении:

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 }
              );
     }
}

Теперь перейдите в свой класс global.asax и добавьте следующую строку кода:

GlobalConfiguration.Configure(WebApiConfig.Register);

Ваш HomeController - это контроллер MVC. Попробуйте создать контроллер API (скажем, CustomersController) и добавьте атрибуты маршрута следующим образом:

[RoutePrefix("api/Product")]
public class CustomersController : ApiController
{
    [Route("{customerName}/{customerID:int}/GetCreditCustomer")]
    public IEnumerable<uspSelectCreditCustomer> GetCreditCustomer(string customerName, int customerID)
    {
        ...
    }

Надеюсь, это поможет

person Somad    schedule 10.11.2016

Стандартное приложение MVC может иметь поддержку как MVC, так и Webapi, если вы отметите и MVC, и Webapi в шаблоне веб-приложения Create New Asp.net.

Вам нужно будет сделать следующее в RouteConfig.cs, поскольку ваш запрос относится к маршрутам MVC, а не к маршрутам webapi:

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

   }
 }

Обратите внимание на строку «routes.MapMvcAttributeRoutes ();» который предоставляет маршруты атрибутов, в то время как вызов «routes.MapRoute (...)» должен предоставить вам обычный маршрут к контроллеру и действию по умолчанию.

Это связано с тем, что маршрутизация по атрибутам и обычная маршрутизация могут быть смешаны. Надеюсь, это поможет.

person Zeeshan Allauddin    schedule 20.08.2017