Дублирование страницы справки Web API Действие для всех областей

Я работаю с Web API 2, и он, кажется, уже подтягивает мои существующие вызовы API, за исключением того, что он дублирует все вызовы для каждой области, которая у меня есть. Например, скажем, у меня есть 3 области, и в одной из них у меня есть вызов API, который выглядит следующим образом:

public IList<string> GetStringList(string id)
    {
        //do work here...
        return new List<string>{"a","b","c"};
    }

если у меня есть 3 области, то страница справки веб-API покажет:

GET area1 / api / MyAPIController / GetStringList / {id}

GET area2 / api / MyAPIController / GetStringList / {id}

GET area3 / api / MyAPIController / GetStringList / {id}

и MyAPIController существует только в 'area2'. Почему это показывает 3 раза, и как я могу это исправить? Если это поможет, моя область регистрации для area2:

public class Area2AreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Area2";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Area2_default",
            "Area2/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

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

    }
}

1 ответ

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

Чтобы включить атрибуты для маршрутизации, добавьте config.MapHttpAttributeRoutes(); регистрации в WebApiConfig, которая должна находиться в папке App_Start.

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

Включив маршрутизацию атрибутов, вы можете указать маршрут для действия:

public class BooksController : ApiController
{
    [Route("api/books")]
    public IEnumerable<Book> GetBooks() { ... }
}

Вы можете прочитать больше здесь. Посмотрите на префиксы маршрутов (показанные выше) и убедитесь, что вы включили маршрутизацию с атрибутами, как показано в начале страницы.

Редактировать:

В твоем случае:

[Route("area2/api/MyAPIController/GetStringList/{id}")]
public IList<string> GetStringList(string id)
{
    //do work here...
    return new List<string>{"a","b","c"};
}
Другие вопросы по тегам