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は、ルーティングコレクションの最初のルートと一致しています。したがって、2番目のルートを検査して一致するかどうかを確認することはありません。「api/{controller} / {id} / {action}」をコレクションの最初のルートにすると、正しく機能するはずです。

于 2013-03-11T04:10:21.030 に答える