我正在设置一个ASP.NET MVC 4 Web来接受来自第三方服务器的请求,而我只是不知道如何设置路由映射。假设第三方服务器希望获得以下方面的响应:
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是否适合这里使用)。
我已写了以下的控制器:
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";
}
}并尝试了在WebAppConfig.Register的任何地方都能找到的所有东西,但是当我在浏览器中尝试请求时,我总是得到一个404错误:
http://localhost:22332/api/authorize?user=ury&session=token&item=an_item我的问题是,为了满足上述请求(假设我的测试URL是正确的.),我必须做什么--特别是在WebAppConfig.Register和控制器中?
发布于 2012-11-24 21:04:01
经过几个小时的努力,在路径调试器的大量帮助下--谢谢菲尔·哈克!--我找到了问题和解决方案。
问题:路由映射匹配是ordered,应用程序的路由映射是从RouteTable.Routes中初始化的,其中包含了相当多的路径映射。我正在寻找的请求模式也匹配了其中的一些映射(例如,将“授权”匹配为控制器)。
解决方案:在默认映射之前添加"my“路由映射。
是的,对..。
由于大多数操作在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);
}
}
}只要“我的”路径映射不匹配默认的映射(我使它们足够具体,不匹配),我就很好--我认为.
发布于 2012-11-19 19:06:51
您会被Web约定绊倒,因为它将URL中的控制器名称与控制器类匹配。
如果控制器的名称是"MyController",那么要请求的URL是:
http://localhost:22332/api/my/authorize?user=ury&session=token&item=an_item要支持请求w/o,URL中的"api“位,只需在WebApiConfig.cs的寄存器方法中添加第二个路由定义即可。因为您在URL中也使用了“action”,所以您需要这两条路径:
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中的"action“,并将所有内容路由到"MyController”类。
https://stackoverflow.com/questions/13421557
复制相似问题