首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web API路由映射到根

Web API路由映射到根
EN

Stack Overflow用户
提问于 2012-11-16 17:31:50
回答 2查看 4.9K关注 0票数 1

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

  1. http://[my_server]/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/release?user=[user name]&session=[session token]

或者,请求可以使用专用路径,即:

  1. http://[my_server]/***api***/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/***api***/release?user=[user name]&session=[session token]

我希望能够支持这两种选择。

类似于传统的/controller/id表单的其他请求也应该实现,但我想重点讨论上面的内容(我甚至不确定Web是否适合这里使用)。

我已写了以下的控制器:

代码语言:javascript
复制
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错误:

代码语言:javascript
复制
http://localhost:22332/api/authorize?user=ury&session=token&item=an_item

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-24 21:04:01

经过几个小时的努力,在路径调试器的大量帮助下--谢谢菲尔·哈克!--我找到了问题和解决方案。

问题:路由映射匹配是ordered,应用程序的路由映射是从RouteTable.Routes中初始化的,其中包含了相当多的路径映射。我正在寻找的请求模式也匹配了其中的一些映射(例如,将“授权”匹配为控制器)。

解决方案:在默认映射之前添加"my“路由映射。

是的,对..。

由于大多数操作在HttpRouteCollection上不受支持,因此产生的代码有点难看,但它的工作原理是:

代码语言:javascript
复制
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);
        }
    }
}

只要“我的”路径映射不匹配默认的映射(我使它们足够具体,不匹配),我就很好--我认为.

票数 1
EN

Stack Overflow用户

发布于 2012-11-19 19:06:51

您会被Web约定绊倒,因为它将URL中的控制器名称与控制器类匹配。

如果控制器的名称是"MyController",那么要请求的URL是:

代码语言:javascript
复制
http://localhost:22332/api/my/authorize?user=ury&session=token&item=an_item

要支持请求w/o,URL中的"api“位,只需在WebApiConfig.cs的寄存器方法中添加第二个路由定义即可。因为您在URL中也使用了“action”,所以您需要这两条路径:

代码语言:javascript
复制
    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“前缀以及控制器参数,我认为您需要一个不同的路由定义。类似于:

代码语言:javascript
复制
    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "ActionOnlyRoute",
            routeTemplate: "{action}",
            defaults: new { controller = "My" }
        );
    }

在这里,我们将只查找URL中的"action“,并将所有内容路由到"MyController”类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13421557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档