Asp.net web api 到根目录的Web API路由映射

Asp.net web api 到根目录的Web API路由映射,asp.net-web-api,asp.net-mvc-routing,asp.net-web-api-routing,Asp.net Web Api,Asp.net Mvc Routing,Asp.net Web Api Routing,我正在设置一个ASP.NET MVC 4 Web API来接受来自第三方服务器的请求,但我根本不知道如何设置路由映射。 假设第三方服务器希望获得以下响应: http://[my_server]/authorize?user=[user name]&session=[session token]&item=[item] http://[my_server]/release?user=[user name]&session=[session token] 或者,请求可以使用专用路径,即: http:

我正在设置一个ASP.NET MVC 4 Web API来接受来自第三方服务器的请求,但我根本不知道如何设置路由映射。 假设第三方服务器希望获得以下响应:

  • http://[my_server]/authorize?user=[user name]&session=[session token]&item=[item]
  • http://[my_server]/release?user=[user name]&session=[session token]
  • 或者,请求可以使用专用路径,即:

  • http://[my_server]/***api***/authorize?user=[user name]&session=[session token]&item=[item]
  • http://[my_server]/***api***/release?user=[user name]&session=[session token]
  • 我希望能够支持这两种选择

    在更传统的
    /controller/id
    表单之后,还应该实现其他请求,但我想重点介绍一下上面的内容(我甚至不确定Web API是否适合这里)

    我编写了以下控制器:

    public class MyController : ApiController
    {
        [HttpGet]
        [ActionName("authorize")]
        public string Authorize(string user, string session, string item)
        {
            ...
            // return "OK" or "DENY";
        }
    
        [HttpGet]
        [ActionName("release")]
        public string Release(string user, string session)
        {
            ...
            return "OK";
        }
    }
    
    并尝试了在SO和
    WebAppConfig.Register
    的其他地方找到的所有内容,但在浏览器中尝试该请求时,我一直收到404错误:

    http://localhost:22332/api/authorize?user=ury&session=token&item=an_item
    

    我的问题是,为了满足上述请求(假设我的测试URL是正确的…),我必须做些什么?特别是在
    WebAppConfig.Register
    和控制器中?

    将URL中的控制器名称与控制器类相匹配的Web API约定会让你大吃一惊

    如果控制器的名称为“MyController”,则请求的URL为:

    http://localhost:22332/api/my/authorize?user=ury&session=token&item=an_item
    
    要支持URL中没有“api”位的请求,只需在WebApiConfig.cs的Register方法中添加第二个路由定义。由于您也在URL中使用“操作”,因此您需要以下两条路径:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    
        config.Routes.MapHttpRoute(
            name: "RootWebApiRoute",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    
    如果您想省略“api”前缀以及控制器参数,我认为您需要一个不同的路由定义。比如:

        public static void Register(HttpConfiguration config) {
            config.Routes.MapHttpRoute(
                name: "ActionOnlyRoute",
                routeTemplate: "{action}",
                defaults: new { controller = "My" }
            );
        }
    

    在这里,我们将只在URL中查找一个“操作”,并将所有内容发送到您的“MyController”类。

    经过几个小时的工作,并得到了-谢谢Phil Haack!-我找到了问题和解决办法

    问题:路由映射匹配是有序的,并且路由表是可设置的。应用程序的路由映射是从路由表初始化的,路由表中包含了很多路由表。我正在寻找的请求模式也匹配了其中一些映射(“authorize”作为控制器匹配)

    解决方案:在默认映射之前添加“我的”路由映射

    是的,对

    由于在
    HttpRouteCollection
    上不支持大多数操作,因此生成的代码有点难看,但它可以工作:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            routesCopy = new RouteBase[RouteTable.Routes.Count];
    
            RouteTable.Routes.CopyTo(routesCopy, 0);
    
            config.Routes.Clear();
            config.Routes.MapHttpRoute(name: "AuthorizeWebApiRoute", routeTemplate: "authorize", defaults: new { controller = "My", action = "authorize" });
            config.Routes.MapHttpRoute(name: "ReleaseWebApiRoute", routeTemplate: "release", defaults: new { controller = "My", action = "release" });
    
            foreach (var route in routesCopy)
            {
                RouteTable.Routes.Add(route);
            }
        }
    }
    

    只要“我的”路由映射与默认映射不匹配(我把它们做得足够具体,没有),我就很好-我想…

    谢谢马克。我不仅要省略“api”,还要省略控制器前缀,而且我不需要使用{id}参数(除非我遗漏了什么)。我确实尝试了routeTemplate:“{action}”,但是我得到了404页面。好的,我已经更新了我的答案。希望这就是你想要的。听起来很简单,但还是不行。。。我得到404,找不到资源(资源是“授权”、“发布”等)。我一次又一次地检查拼写(通常的疑点),没问题。你知道怎么找出哪里出了问题吗?