1

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

  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 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

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

4

2 回答 2

2

您会被用于将 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”类。

于 2012-11-19T19:06:51.690 回答
1

经过几个小时的工作并得到了Route Debugger的大力帮助- 谢谢 Phil Haack!- 我找到了问题和解决方案。

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

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

对,对...

由于 不支持大多数操作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-24T21:04:01.010 回答