Вам не нужен особый маршрут.DefaultApi
будет направлять ваше действие по соглашению .Удалите свой собственный LoginApi
маршрут и используйте метод соглашения в вашем контроллере
public class LoginController : ApiController
{
public void Post()
{
// authenticate here
}
}
или, если вы настаиваете на присвоении имени действию Authenticate
, вы можете использовать вариацию маршрутизации по HTTP-глаголу
public class LoginController : ApiController
{
[HttpPost]
public void Authenticate()
{
// authenticate here
}
}
Это заставит API Explorer сформировать нужную вам страницу справки:
Редактировать
Для поддержки нескольких методов действия, которые используют один и тот же глагол HTTP, вы должны настроитьмаршрутизация по имени действия аналогична той, что вы делали, но я не вижу параметра {action}
в вашем маршруте.Это должно быть:
config.Routes.MapHttpRoute(
name: "LoginApi",
routeTemplate: "api/Login/{action}",
defaults: new { controller = "Login", action = "Authenticate" }
);
Если указать действие по умолчанию, как указано выше, URL /api/Login
будет правильно перенаправлен на LoginController.Authenticate
, однако на странице справки действие будет отображаться как POST api/Login/Authenticate
, посколькуApiExplorer
почему-то не распознает действие по умолчанию.Чтобы исправить это, я бы предпочел избежать взлома справочной страницы, как вы сделали в своем собственном ответе, потому что она может откусить вас назад.Вместо этого вы можете принудительно задать маршрут для действия по умолчанию, используя RouteAttribute
.Код контроллера будет выглядеть следующим образом:
public class LoginController : ApiController
{
[HttpPost]
[Route("api/Login")]
public void Authenticate()
{
// authenticate here
}
[HttpPost]
public void Register()
{
// register here
}
}
На странице справки будет отображаться:
POST api / Login
POST api / Login / Register