Попробуйте использовать подстановочный знак 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"