Asp.net web api 到根目录的Web API路由映射
我正在设置一个ASP.NET MVC 4 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:
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,找不到资源(资源是“授权”、“发布”等)。我一次又一次地检查拼写(通常的疑点),没问题。你知道怎么找出哪里出了问题吗?