GET / POST / DELETE的自定义路由不匹配

时间:2014-07-30 18:30:32

标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我尝试做的是在默认路由模板使用的自定义路由中使用类似的路由模板,但是获得405 - 不允许的方法。

第一个匹配GET请求@ api/accounts/abc123/contacts但是关于它。其他两个不匹配,默认路由@ api/{controller}/{id}匹配所有四个动词。

编辑:更新了路线定义

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

config.Routes.MapHttpRoute(
    name: "ContactsApi",
    routeTemplate: "api/{controller}/{id1}/contacts"
);

config.Routes.MapHttpRoute(
    name: "AddressesApi",
    routeTemplate: "api/{controller}/{id2}/addresses"
);

config.Routes.MapHttpRoute(
    name: "CoverageApi",
    routeTemplate: "api/{controller}/{id3}/coverage"
);

config.Routes.MapHttpRoute(
    name: "AccountsApi",
    routeTemplate: "api/{controller}/{id4}/accounts"
);

我尝试将以上路线映射到以下操作:

编辑:根据上述路线定义更新了{id1}参数。

[HttpGet]
public List<Contact> GetContacts(string id)
{
    return accounts.GetContacts(id);
}

[HttpPost]
public void PostContacts(string id1, [FromBody]IEnumerable<Contact> contacts)
{
    bool success = accounts.AssignContacts(id, contacts);
}

[HttpDelete]
public void DeleteContacts(string id1, [FromBody]IEnumerable<Contact> contacts)
{
    bool success = accounts.RemoveContacts(id, contacts);
}

我只想保持路线一致......

1 个答案:

答案 0 :(得分:1)

您只需要使用一条路线来匹配上面给出的操作:

config.Routes.MapHttpRoute(
    name: "ApiContacts",
    routeTemplate: "api/{controller}/{id}/contacts"
);

因为您的操作以相关的http动词开头,所以将调用相应的操作。