Маршрутизация к контроллеру со вторым параметром, который не является идентификатором в Web API - PullRequest
0 голосов
/ 22 сентября 2019

1) У меня есть контроллер с префиксным маршрутом, т. Е. Companies.

Когда я вызываю следующее действие:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

, он возвращает мне список компаний, но теперь я быЯ хотел бы объявить о втором действии, в котором я могу вернуть список компаний и его 3 главных контакта, поэтому я решил определить свое новое действие следующим образом:

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

как RoutePrefix определяется как

[RoutePrefix("Companies")]

Я думал, что смогу вызвать свой URI, используя следующее:

http://localhost/companies/contacts

, но это всегда похоже на действие GetCompanies.

Я могу только предположить, что мой маршрут не обрабатывается, но я не уверен, как добавить такое специальное действие к

config.Routes.MapHttpRoute(....)

2) Кроме того, есть способ определить этот второйсовместимы с маршрутом или лучше использовать параметр строки запроса, чтобы указать, что я хочу включить пользователей?

.. / companies ../companies/users

Спасибо

ОБНОВЛЕНИЕ-1:

Это то, что моя функция регистрации в моем WebApiConfig.cs попытался добавить определенный маршрут, но безуспешно:

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "OrganizationWithUsers",
    routeTemplate: "api/Companies/Contacts"
);

UPDATE-2:

Если я удаляю:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

Он вызывает

[HttpGet]
[Route("Contacts")
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

но я получаю ошибку The value 'contacts' is not valid for Guid..

Хммм ... Я вижу, что происходит, но я не уверен, как это исправить.У меня также есть GetCompany, которая определяется следующим образом:

[HttpGet]
public async Task<IHttpActionResult> GetCompany(Guid id)

, так что похоже, что этот удар сейчас, что имеет смысл.

Я попытался добавить ограничение на этоти добавьте мой маршрут обратно в GetCompaniesAndContacts и удалите RoutePrefix, но он не сработал.

Я думаю, что есть конфликт, потому что у меня есть 2 идентичных получения, и он не может различить 2.

ОБНОВЛЕНИЕ-3:

Вот полное определение в соответствии с просьбой:

[RoutePrefix("Companies")]
[ValidationModel]
[ApiException]
public class CompaniesController : BaseController
{
    ...
    [HttpGet]
    public async Task<IHttpActionResult> GetCompanies(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    }

    [HttpGet]
    [Route("Contacts")]
    public async Task<IHttpActionResult> GetCompaniesAndContacts(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    } 
}

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Я выяснил свою проблему, и это было до префикса маршрута!

Я определил его как:

[RoutePrefix("companies")]
public class CompaniesController : BaseController
{
}

Когда это должно было быть определено как:

[RoutePrefix("api/companies")]
public class CompaniesController : BaseController
{
}

После определения, как указано выше, я смог использовать

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}

для запроса компаний, использующих только

http://localhost/api/companies?PageIndex...

, и для запроса компаний и основных контактов, я простопришлось определить новый маршрут с помощью «Контактов».

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}   

И теперь я могу назвать его следующим образом:

http://localhost/api/companies/contacts?PageIndex...

Глупая ошибка , новсе еще надеюсь, что это помогает другим.Не забудьте включить ваш api в префиксный маршрут !!

0 голосов
/ 22 сентября 2019

При создании нового проекта мне удалось создать новый контроллер, написать 2 действия GET

public class TestController : Controller
{
    public string GetCompanies()
    {
        return "Companies";
    }

    public string GetCompaniesAndContacts()
    {
        return "Companies & Contacts";
    }
}

Следующие 2 URL-адреса работают как положено

БЕЗ любых изменений в маршрутах.

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

routes.MapRoute(
    name: "Company Routes",
    url: "api/Companies/{action}/{id}",
    defaults: new {controller = "Test", action = "GetCompanies", id = UrlParameter.Optional}
);

Я добавил вышеупомянутый маршрут перед маршрутом по умолчанию, а затем следующий URL работал как ожидалось

Я бы посоветовал вам поиграть с маршрутизацией в НОВОМ скрэтч-проекте, а затем применить это понимание к вашему сценарию использования.

...