4

我一直在努力解决我的路由问题,经过几天尝试谷歌解决方案但没有运气,我希望有人能够对我的问题有所了解。

我的 WebApiConfig 中有以下路由:

        config.Routes.MapHttpRoute(
            name: "AccountStuffId",
            routeTemplate: "api/Account/{action}/{Id}",
            defaults: new { controller = "Account", Id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "AccountStuffAlias",
            routeTemplate: "api/Account/{action}/{Alias}",
            defaults: new { controller = "Account", Alias = RouteParameter.Optional }
        );

和以下控制器方法:

    [HttpGet]
    public Account GetAccountById(string Id)
    {
        return null;
    }

    [HttpGet]
    public Account GetAccountByAlias(string alias)
    {
        return null;
    }

如果我打电话: /API/Account/GetAccountById/stuff那么它会正确调用GetAccountById.

但如果我打电话/API/Account/GetAccountByAlias/stuff,那么什么也不会发生。

显然,这里的顺序很重要,因为如果我在我的 WebApiConfig 中切换我的路由声明,然后/API/Account/GetAccountByAlias/stuff正确调用GetAccountByAlias,并且/API/Account/GetAccountById/stuff什么都不做。

这两个[HttpGet]装饰是我在 Google 上找到的一部分,但它们似乎无法解决问题。

有什么想法吗?我在做任何明显错误的事情吗?

编辑:

当路由失败时,页面显示如下:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://localhost:6221/API/Account/GetAccountByAlias/stuff'.
    </Message>
    <MessageDetail>
        No action was found on the controller 'Account' that matches the request.
    </MessageDetail>
</Error>
4

2 回答 2

6

您应该能够拥有以下路线:

config.Routes.MapHttpRoute(
        name: "AccountStuffId",
        routeTemplate: "api/Account/{action}/{Id}",
        defaults: new { controller = "Account", Id = RouteParameter.Optional }
    );

并为您的操作执行以下操作:

[HttpGet]
public Account GetAccountById(string Id)
{
    return null;
}

[HttpGet]
public Account GetAccountByAlias([FromUri(Name="id")]string alias)
{
    return null;
}
于 2013-08-02T19:42:49.647 回答
1

您是否有理由需要声明两条不同的路线?

查看指南:http ://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

他们有一个默认路由,并且通过示例,您在配置中需要的只是

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
于 2013-08-02T19:31:00.243 回答