我正在尝试并排使用Web API和Web应用程序,并且在Web API路由方面存在一些问题。
这些是路线配置:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
// Map this rule first
config.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/"
);
//sets up the API route
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/"
//,defaults: new { id = RouteParameter.Optional }
);
它适用于Web应用程序,并且适用于仅包含/ api / controller的web api,但如果我调用/ api / controll / action
则无法正常工作我正在使用:
[HttpPost]
[ActionName("ConfirmRequest")]
public HttpResponseMessage ConfirmRequest(string guid, string type, PartiStatus status = PartiStatus.Yes)
指定动作动词和名称。我尝试了路由调试器(在web api中不起作用)和另一个(并崩溃)并且无法使POST操作起作用。
我最终将此操作更改为GET并且工作正常,我猜GET参数可以帮助框架解决这个问题。
我仍然不确定如何让它正常工作。 (没有个性映射到行动)
答案 0 :(得分:1)
根据我对Web API和路由的经验,最好将默认操作置于底部。我还删除了“全部捕获”,并为基本动词GET / PUT / POST / DELETE设置了每个控制器的默认值。
尝试这样的事情
config.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/Target/ConfirmRequest/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您的示例通话看起来像这样
POST api/Target/ConfirmRequest?guid={guid}&type={type}&status{status}
当快速测试REST API调用Postman时,我会与Fiddler一起使用一个方便的小Chrome加载项。它允许您保存URL和多个环境以便快速调试。
答案 1 :(得分:0)
确保您实际向相关网址发出POST请求。您的路由似乎是正确的,虽然您已经提到如果您将[HttpPost]
属性更改为[HttpGet]
,但您没有提及相应地更改您的请求。
如果您要对ConfirmRequest
操作的URL发出GET请求,并且其唯一的重载是使用[HttpPost]
属性修饰的,则请求将不会映射到此操作。
大多数浏览器都有一个分析器,可以让您详细检查HTTP请求(例如Chrome's Network Panel)。如果请求不是来自浏览器,您可以尝试使用Fiddler这样的独立分析器。