Как перегрузить метод WebApi

Я новичок в WebApi, и сейчас у меня есть два метода httpPost, таких как

[HttpPost]
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
  Repository.Repository.personsList.Add(person);
  return Repository.Repository.personsList;
}

а второй метод

[HttpPost]
public List<YellowPages.City> getRelevantCity(string stateID)
{
   return new Repository.YellowPages.City().getCity()
   .Where(x => x.StateID ==stateID).ToList();
}

всякий раз, когда я вызываю метод getRelevantCity, вызывается метод AddPersonDetails, я считаю, что это как-то связано с архитектурой REST. теперь мой вопрос: как я могу справиться с этой ситуацией. Есть ли что-нибудь, что я могу сделать в файле WebApiConfig.cs и добавить ограничения? если да, то как обрабатывать ограничения для типа модели, которые я использую. Спасибо.

ОБНОВЛЕНИЕ 1

как я предположил, я изменил свой метод удаления атрибутов следующим образом

public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
   Repository.Repository.personsList.Add(person);
   return Repository.Repository.personsList;
} 

public List<YellowPages.City> getRelevantCity(string stateID)
{
            return new Repository.YellowPages.City().getCity().Where(x => x.StateID == stateID).ToList();
}

Мой вызов ajax выглядит следующим образом

 $('#StateID').change(function () {
        $.ajax({
            type: 'POST',
            url: '/api/shoppingCart/getRelevantCity',
            ContentType: 'application/json',
            data: { 'stateID': $('#StateID').val() },
            dataType: 'json',
            success: function (returnData) {
                var grid = '';
                $.each(returnData, function (i, d) {
                    grid = grid + createDom(d);
                });
                $('#result').empty().append(
                    grid
                    );
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert('error');
            }
        });
    }); 

$('#btnAjax').click(function (e) {
        debugger;
        e.preventDefault();
        var d = { 'PersonName': $('#PersonName').val(), 'gender': $('#gender').prop('checked', true).val(), 'StreetAddress': $('#StreetAddress').val(), 'StateID': $("#StateID option:selected").text(), 'Pincode': $('#Pincode').val() };
        $.ajax({
            type: 'POST',
            url: '/api/shoppingCart/AddPersonDetails',
            ContentType: 'application/json',
            data: d,
            dataType: 'json',
            success: function (returnData) {
                var grid = '';
                $.each(returnData, function (i, d) {
                    grid = grid + createDom(d);
                });
                $('#result').empty().append(
                    grid
                    );
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert('error');
            }
        });

    });

Независимо от того, какой вызов ajax я создаю, вызывается первый метод, можете ли вы помочь мне, как его перекрыть?

ОБНОВЛЕНИЕ 2

мой вопрос прост

Предположим, если у меня есть 4 метода GET в моем webApi, то как я могу обрабатывать webApi, чтобы я мог реализовать все реализованные 4 метода GET.

Ответ 1

Перейдите для маршрутизации атрибутов. В конфигурации api добавьте

config.MapHttpAttributeRoutes();

И над контроллером:

[RoutePrefix("api")]
public class ShoppingCartController....

И для действий:

[HttpPost]
[Route("getRelevantCity")]
public List<YellowPages.Person> GetRelevantCity

[HttpPost]
[Route("addPersonDetails")]
public List<YellowPages.Person> AddPersonDetails

Таким образом, ваш GetRelevantCity идеально должен быть методом GET, а не POST. Я бы предложил вам изменить это на HttpGet в действии, а также в вашем javascript-коде:

[HttpGet] //this is not required; as per naming convention this will be a GET request by default
[Route("getRelevantCity/{stateId}")]
public List<YellowPages.Person> GetRelevantCity(int stateId)

И в $.ajax измените type: 'GET' и передайте stateId в параметрах или в виде строки запроса или api/getRelevantCity/123, где 123 является идентификатором состояния

Ответ 2

Это ваш случай? Я полностью согласен с ответом о методах GET и POST, но вы можете использовать OdataController. Он будет выглядеть как обычный вызов для отдыха, но он может вызывать методы (которые вы определяете), такие как api/Object (123)/GetRelevantCity или api/Object (123)/getRelevantCity (но вместо api/Object/123)

Также вы можете создать собственное ограничение, основанное на теле запроса (пример ограничения): Извините за этот способ чтения данных сообщения...

public class TypeConstraint: IHttpRouteConstraint
{

    public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values,
        HttpRouteDirection routeDirection)
    {
        return IsItCorrect(request.Content.ReadAsStringAsync().Result);
    }
}

этот способ чтения requestMessage и там является полным примером множественной pust (этот код может быть не таким чистым и должен быть реорганизован, но я надеюсь, что идея довольно ясна)