Дублирование страницы справки 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"};
}