C# 中的 Web API 路由

Web API routing in C#

我正在尝试构建一个接受 2 个参数的网络 API。但是,在调用 API 时,它总是命中没有任何参数的方法。 我按照 here 中的说明进行操作,但不明白为什么它不起作用。

我使用 'PostMaster' Chrome 扩展发送的请求:http://localhost:51403/api/test/title/bf

对于上面的请求,我预计会命中第一个方法,但是正在到达第二个方法。

控制器中的方法是:

// Get : api/test/type/slug
public void Get(string type,string slug){
//Doesn't reach here
}

// Get : api/test
public void Get() {
// Reaches here even when the api called is GET api/test/type/slug
}

webApiConfig 没有太大变化,除了它接受 2 个参数:

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id1}/{id2}",
            defaults: new { id1 = RouteParameter.Optional, id2 = RouteParameter.Optional }
        );
    }

我对文档的理解是不必更改 webapiconfig。 这是我得到的错误

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:51403/api/test/title/bf'.",
"MessageDetail":"No action was found on the controller 'test' that matches the request."}

您必须在路由配置中使用名为 id1 和 id2 的参数名称。 像这样:

// Get : api/test/type/slug
public void Get(string id1,string id2){
    //Doesn't reach here
}

为了让路由引擎将请求路由到正确的 Action,它首先查找参数与路由中的名称匹配的方法。

换句话说,这个:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id1}/{id2}",
            defaults: new { id1 = RouteParameter.Optional, id2 = RouteParameter.Optional }
);

匹配项:

public void Get(string id1, string id2) {}

但不是:

public void Get(string type, string slug) {}

如果你愿意,这也行得通:

http://localhost?type=weeeee&slug=herp-derp

这会匹配

public void Get(string type, string slug)