Asp.net mvc ASP.MVC web api路由问题
我试图同时使用Web API和Web应用程序,但在Web API路由方面存在一些问题 以下是路线配置:Asp.net mvc ASP.MVC web api路由问题,asp.net-mvc,asp.net-web-api,asp.net-mvc-routing,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc Routing,我试图同时使用Web API和Web应用程序,但在Web API路由方面存在一些问题 以下是路线配置: routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } )
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参数可以帮助框架解决这个问题
我仍然不知道如何使它正常工作。(无需映射到操作)确保您实际上是在向相关URL发出POST请求。看起来您的路由是正确的,虽然您已经提到,如果您将
[HttpPost]
属性更改为[HttpGet]
,它会起作用,但您没有提到相应地更改您的请求
如果您正在为ConfirmRequest
操作向URL发出GET请求,并且其唯一重载使用[HttpPost]
属性修饰,则请求将不会映射到此操作
大多数浏览器都有一个分析器,允许您详细检查HTTP请求(例如)。如果请求不是来自浏览器,您可以尝试像这样的独立探查器。确保您实际上是在向相关URL发出POST请求。看起来您的路由是正确的,虽然您已经提到,如果您将
[HttpPost]
属性更改为[HttpGet]
,它会起作用,但您没有提到相应地更改您的请求
如果您正在为ConfirmRequest
操作向URL发出GET请求,并且其唯一重载使用[HttpPost]
属性修饰,则请求将不会映射到此操作
大多数浏览器都有一个分析器,允许您详细检查HTTP请求(例如)。如果请求不是来自浏览器,您可以尝试像这样的独立探查器。根据我对Web API和路由的经验,最好将默认操作放在底部。我还删除了“catch all”,并为基本动词GET/PUT/POST/DELETE设置了默认的per控制器 试试这样的
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}
你的样本电话看起来像这样
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}
Postman说,在快速测试RESTAPI调用时,我与Fiddler一起使用了一个方便的Chrome插件。它允许您保存URL和多个环境以进行快速调试。根据我对Web API和路由的经验,最好将默认操作放在底部。我还删除了“catch all”,并为基本动词GET/PUT/POST/DELETE设置了默认的per控制器 试试这样的
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}
你的样本电话看起来像这样
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}
Postman说,在快速测试RESTAPI调用时,我与Fiddler一起使用了一个方便的Chrome插件。它允许您保存URL和多个环境,以便快速调试。谢谢!我正在使用Get-when[HttpGet]和post-when[HttpPost]并使用fiddler来验证和提交post/Get。而路由仍然无法正常工作?你得到了什么结果?谢谢!我正在使用Get-when[HttpGet]和post-when[HttpPost]并使用fiddler来验证和提交post/Get。而路由仍然无法正常工作?你得到了什么结果?