我正在尝试在我的ApiController中配置一个方法来处理所有POST请求,无论路径段的数量是多少,并且接收始终为json的post主体。我已经尝试了通配符表和属性路由的几种变体,但无法使其适用于具有多于1个路径段的请求。
另外,我无法弄清楚如何在方法中接收整个json体。
[RoutePrefix("api")]
public class MyController: ApiController
{
[HttpPost]
[Route("*")]
public string PostHandler([FromBody]string jsonBody)
{
var requestPath = Request.RequestUri.LocalPath;
return jsonBody;
}
}
尝试在[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>\?|(=.*?))?}
使用this工具我发现[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"