WebApi не находит действия на контроллере - PullRequest
0 голосов
/ 11 сентября 2018

Добрый день.
Однако я создал вызов ajax, который пытается достичь моей функции C #; я получаю сообщение об ошибке «На контроллере« PortalApi »не найдено никаких действий, соответствующих запросу». Запрос является постом, и к функции сервера прикреплен соответствующий заголовок Http. Имя и параметры функции также идентичны.

Аякс

GetExtendersGridDataFromServer(requestParameters) {
    extendersGridSource = null;
    var gridFilterParams = JSON.stringify(requestParameters);
    $.ajax(
    {
        async: false, 
        contentType: "application/json",
        converters: Utills.jQueryAjaxJsondDataConverter,
        data: JSON.stringify({ gridFilterParams: gridFilterParams, securityCode: securityCode }),
        dataType: "jsond",
        type: "POST",
        url: (Utills.getBaseURL() + "/Api/PortalApi/GetExtenderGridData"),
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(XMLHttpRequest.responseText);
        },
        failure: function (msg) {
            alert("failure");
        },
        success: function (msg) {
            alert("success");
        }
    });
}

C #

    [HttpPost]
    public JqGridData GetExtenderGridData(string securityCode)
    {
        IMUserSecurity.UserSecurity.ValidateWebMethodSecurityCode(securityCode, "PortalWebService.GetExtenderGridData");

        return GetDoctorGridData("extender");
    }

маршрут конфигурации

    configuration.Routes.MapHttpRoute("API Action Default", "api/{controller}/{action}/{id}",
        new
        {
            id = RouteParameter.Optional
        });

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Попробуйте добавить атрибут FromBody ( больше информации ).

public JqGridData GetExtenderGridData([FromBody] Security security) { ... }


public class Security
{
    public object GridFilterParams { get; set; }
    public string SecurityCode { get; set; }
}
0 голосов
/ 11 сентября 2018

Две возможные проблемы здесь:

Маршрутизация

Я рекомендую вам использовать атрибутную маршрутизацию, а не зависеть от условной маршрутизации ( IMO, это может быть болезненно )

Включить маршрутизацию атрибутов в методе Register в WebApiConfig.cs

config.MapHttpAttributeRoutes();

Затем настройте свой контроллер API и метод API с помощью атрибутов RoutePrefix и Route. Вместе RoutePrefix + Route объединяются, чтобы построить ваш полный маршрут к вашему методу, в этом пример api/PortalApi/GetExtenderGridData

[RoutePrefix("api/PortalApi")]
public class PortalApiController : ApiController
{
    [Route("GetExtenderGridData")]
    [HttpPost]
    public IEnumerable<Order> FindOrdersByCustomer(int customerId) { ... }
}

Тело запроса

Ваш метод API FindOrdersByCustomer принимает в качестве параметра одну строку, но ваш клиент пытается отправить объект методу, что в данный момент невозможно. Клиентский объект определен как

{ gridFilterParams: gridFilterParams, securityCode: securityCode }

Чтобы иметь возможность отправить это на серверный API, необходимо убедиться, что он соответствует этой подписи. Создайте класс, который отражает модель клиента (я не знаю, что такое gridFilterParams, но вы понимаете, в чем дело)

public class RequestModel
{
    public object GridFilterParams { get;set; }
    public string SecurityCode { get; set; }
}

Затем прочитайте это из тела запроса в методе API

[RoutePrefix("api/PortalApi")]
public class PortalApiController : ApiController
{
    [Route("GetExtenderGridData")]
    [HttpPost]
    public IEnumerable<Order> FindOrdersByCustomer([FromBody]RequestModel model) { ... }
}
0 голосов
/ 11 сентября 2018

У меня недостаточно репутации, чтобы комментировать, но вы можете попробовать это

[HttpPost("GetExtenderGridData")

вместо

[HttpPost].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...