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何もしないため、ここでは明らかに順序が重要です。

2 つの[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 に答える