【发布时间】:2018-02-06 13:43:50
【问题描述】:
这是WebApiConfig.cs中路由的配置
// Web API configuration and services
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}");
// Web API routes
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultAdpi",
routeTemplate: "api/ms/{controller}/{action}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "MSApi",
routeTemplate: "api/{controller}/ms/{action}",
defaults: new { controller="GPI" }
);
config.MapHttpAttributeRoutes();
这是我的控制器。
[HttpPost]
public IHttpActionResult payout(string t)
{
这是httpRequest
POST /api/Race/payout HTTP/1.1
Host: localhost
User-Agent: PostmanRuntime/7.1.1
Content-Length: 4
Accept: */*
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
Postman-Token: f2adaf2e-d518-4924-bd28-8a901bd1846f
X-Forwarded-For: 84.228.5.88
X-Forwarded-Proto: https
X-Original-Host: integerator.eu.ngrok.io
t=da
我在这个控制器中有一些功能。控制器的名称没有问题。动作被调用。
更多细节。如果我使用 [FromBody] 属性,我会得到 t 值为 null。
[HttpPost]
public IHttpActionResult payout([FromBody]string t)
{
t 变量为空。
我必须将 t 作为字符串变量。我不想把它改成另一种类型。
请帮助我理解这种尴尬的路由行为。
更新
我有以下两个动作:
[HttpPost]
public IHttpActionResult payout(string t)
{
和
public IHttpActionResult payout([FromBody] Object req)
{
我提到的 http 请求总是转到第二个支付操作,而不是第一个操作。 我希望使用字符串参数的第一个操作拦截该发布请求。 我不明白为什么第一个动作没有处理请求。即使完全删除第二个操作也是如此。
我尝试使用名为“Post man”的工具发布不同的 http 内容类型标头。
这是我仅在控制器中执行第一个操作时遇到的错误,
{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:55392/api/Race/payout'.",
"MessageDetail": "No action was found on the controller 'Race' that
matches the request."
}
我考虑过用对象覆盖模型绑定,这里描述的方式:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
但我不认为有什么相关的。有没有办法破解路由的工作方式并拦截传入的请求?
【问题讨论】:
标签: asp.net-web-api