4

我已经尝试了一切,但看起来我根本没有得到它。我的 WebApiConfig.cs 看起来像这样:

config.Routes.MapHttpRoute(
    "Default",
    "api/{controller}/{id}",
    new { id = RouteParameter.Optional });

config.Routes.MapHttpRoute(
    "AccountVerification",
    "api/{controller}/{id}/{action}",
    null,
    new { controller = "Account" });

我的控制器看起来像这样:

public class AccountController : ApiController {
    public HttpResponseMessage GetByKey(Guid accountID) {
        ...
    }

    [HttpGet]
    [ActionName("Verify")]
    public HttpResponseMessage VerifyAccount(Guid accountID) {
        ...
    }
}

这些方法应该会受到以下 URL 的欢迎:

GET /api/account                                        - WORKS
GET /api/account/00000000-0000-0000-000000000001        - WORKS
GET /api/account/00000000-0000-0000-000000000001/verify - DOESNT WORK

我尝试了很多东西;我肯定在这里做错了什么......请帮忙。

4

2 回答 2

2

首先,如果您想使用假 Guid 进行测试,并且具有可选的 Guid 参数,它们必须是 Nullable 参数(假 guid 将被反序列化为 null):

public class AccountController : ApiController
{
    public HttpResponseMessage GetByKey(Guid? accountID)
    {
        throw new Exception("GetByKey " + (accountID.HasValue ? accountID.ToString() : "NULL"));
    }

    [System.Web.Http.HttpGet]
    [System.Web.Http.ActionName("Verify")]
    public HttpResponseMessage VerifyAccount(Guid? accountID)
    {
        throw new Exception("VerifyAccount "+(accountID.HasValue?accountID.ToString():"NULL"));
    }
}

那么,您的映射应该:

  • 首先使用最具体的路线
  • 使用正确的参数名称
  • 对动作使用正确的默认值

    config.Routes.MapHttpRoute(
        "AccountVerification",
        "api/{controller}/{accountID}/{action}"
        );
    
    
    config.Routes.MapHttpRoute(
        "Default",
        "api/{controller}/{accountID}",
        defaults: new { Controller="Account", action = "GetByKey", accountID = RouteParameter.Optional }
        );
    
于 2013-03-11T10:30:43.523 回答
1

GET /api/account/00000000-0000-0000-000000000001/verify 匹配路由集合中的第一个路由。因此,它从不检查第二条路由是否匹配。将“api/{controller}/{id}/{action}”设置为集合中的第一个路由,它应该可以正常工作。

于 2013-03-11T04:10:21.030 回答