POST маршрута C # Web API всегда возвращает 404 - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть вопрос, касающийся маршрутизации POST-запроса с помощью ASP.NET Web API 2.

Я не могу вызвать функцию POST, она всегда возвращает not found 404.

{
   "Message": "No HTTP resource was found that matches the request URI 'https://....../api/CombinedPOResponse/PostCombinedPOResponse'.",
   "MessageDetail": "No action was found on the controller 'CombinedPOResponse' that matches the request."
}

Может кто-то указать, где моя конфигурация нарушена?Вот соответствующая часть контроллера

namespace FormSupportService.Controllers
{
    public class CombinedPOResponseController : ApiController
    {
        [HttpPost]
        public IHttpActionResult PostCombinedPOResponse(string inputXml)
        {
            AddPurchaseOrderResponse response = new AddPurchaseOrderResponse();
            //...
            return Ok(response);
        }

        //...
    }
}

И извлечение WebApiConfig.cs

    // UnitCodeLookup
    config.Routes.MapHttpRoute(
        name: "CombinedPOResponseApi",
        routeTemplate: "api/{controller}/{action}",
        defaults: new { inputXml = RouteParameter.Optional }
     );

Я могу связаться со всеми другими контроллерами без проблем, но этот хитрый.

Спасибо

Редактировать:

Я звоню в службу с помощью JavaScript:

$.ajax("/api/CombinedPOResponse/PostCombinedPOResponse",
    {
        accepts: "text/html",
        data: {inputXml: inputXml},
        dataType: 'json',
        method: 'POST',
        error: error,
        success: success
    });

1 Ответ

0 голосов
/ 07 февраля 2019

Во-первых, в следующем коде

config.Routes.MapHttpRoute(
    name: "CombinedPOResponseApi",
    routeTemplate: "api/{controller}/{action}",
    defaults: new { inputXml = RouteParameter.Optional } //this line is not necessary
 );

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

Чтобы запрос работал, вы должны добавить [FromBody] к параметру действия

[HttpPost]
public IHttpActionResult PostCombinedPOResponse([FromBody] string inputXml)
{
    AddPurchaseOrderResponse response = new AddPurchaseOrderResponse();
    //...
    return Ok(response);
}

Если вы попробуете этот код, все будет работать нормально, кроме inputXml всегда будет null.Чтобы это исправить, вам нужно обновить ваш javascript

$.ajax("/api/CombinedPOResponse/PostCombinedPOResponse",
{
    accepts: "text/html",
    data: {"": inputXml}, //empty name
    dataType: 'json',
    method: 'POST',
    error: error,
    success: success
});
...