Asp.net mvc ASP.MVC 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 } )

我试图同时使用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参数可以帮助框架解决这个问题


我仍然不知道如何使它正常工作。(无需映射到操作)

确保您实际上是在向相关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。而路由仍然无法正常工作?你得到了什么结果?