Маршрутизация всех запросов POST к 1 методу APIController, который получает тело POST - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь настроить один метод в моем ApiController для обработки всех запросов POST, независимо от количества сегментов пути, и для получения тела сообщения, которое всегда является json. Я пробовал несколько вариантов подстановочных таблиц и маршрутизации атрибутов, но не могу заставить его работать для запросов с более чем 1 сегментом пути.

Кроме того, я не могу понять, как получить все тело json в методе.

[RoutePrefix("api")]
public class MyController: ApiController
{

    [HttpPost]
    [Route("*")]
    public string PostHandler([FromBody]string jsonBody)
    {

        var requestPath = Request.RequestUri.LocalPath;

        return jsonBody;
    }
}      

1 Ответ

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

Попробуйте использовать подстановочный знак regex в [Route ()] и не указывайте [RoutePrefix]. Также попробуйте взять тело непосредственно из запроса в виде строки, это должно работать.

public class MyController: ApiController
{

    [HttpPost]
    [Route("api/{*[a-zA-Z]}")]
    public string PostHandler()
    {
        string result = Request.Content.ReadAsStringAsync().Result;   
        var requestPath = Request.RequestUri.LocalPath;

        return result;
    }
}   

Если вы хотите работать с асинхронным, попробуйте этот код:

public class MyController: ApiController
{

    [HttpPost]
    [Route("api/{*[a-zA-Z]}")]
    public async Task<string> PostHandler()
    {
        string result = await Request.Content.ReadAsStringAsync();   
        var requestPath = Request.RequestUri.LocalPath;

        return result;
    }
} 

РЕДАКТИРОВАТЬ

В [Route("api/{*asd}")] часть {*[a-zA-Z]} ничего не делает, скорее стек MVC проверяет каждый маршрут с помощью регулярного выражения:

{(?<parameterName>.+?)(:(?<constraint>.*?(\(.*?\))?))*(?<defaultValue>\?|(=.*?))?}  

Используя этот инструмент , я обнаружил, что [a-zA-Z] является частью группы parameterName и используется как введение значений в параметры действия.

Если мы используем

public class MyController: ApiController
{

    [HttpPost]
    [Route("api/{*path}")]
    public string PostHandler(string path)
    {
        string result = Request.Content.ReadAsStringAsync().Result;   
        var requestPath = Request.RequestUri.LocalPath;

        return result;
    }
}   

и позвоните / api / user / 123 / orders / 100, затем:

path = "user/123/orders/100" 
requestPath = "/api/user/123/orders/100"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...