1

APIを作成しようとしています。署名は次のようになります。

public class CardsController : ApiController
{
    [HttpGet]
    public ClientData NewGame(){...}
    [HttpGet]
    public ClientData Deal(int sessionId){...}
    [HttpGet]
    public ClientData Stand(int sessionId){...}
}

他のすべてがデフォルトであると、クラスがDealとStandを区別できないというエラーが発生していました。少し調べてみたところ、ルーティングの問題であることがわかりました。そこで、ルーティングを更新することにしました。

私のglobal.asax.csは次のようになります。

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute("api", "api/{controller}/{action}/{value}", new { value = RouteParameter.Optional});
    }
}

に移動すると、 HttpResourcehttp://localhost:54924/api/Cards/Stand/19が見つからなかったというエラーが表示され、に移動するとアクションがhttp://localhost:54924/api/Cards/StandトリガーされますNewGame()。Stand and Dealを同じコントローラーで動作させるにはどうすればよいですか?

4

2 に答える 2

3

WebAPIはRESTfulルートで動作します。RESTには、リソースとそれらを使用した標準アクション(GET、POST、PUT、PATCH、およびDELETE)があります。それがあなたの行動に名前を付ける方法です。ルーティングに絶対に注意することDealを意味します。APIを設計するときは、リソースと、それらのリソースで実行できる標準のHTTP動詞の観点から考える必要があります。RESTful APIでは、コントローラーはリソースを表し、HTTP動詞はこのリソースで実行するアクションです。StandRESTful

Web Apiルーティングに組み込まれているデフォルトのRESTful規則に違反する場合は、ルート設定を変更して{action}名前を含める必要があります。そうすれば、アクションに好きな名前を付けることができます。APIを設計している場合、消費者が準拠する標準があることを覚えておいてください。ホイールを再発明したい場合は、APIの本当に優れたドキュメントがあることを確認してください。

于 2012-12-15T23:09:16.383 に答える
1

ルートを追加します。

routes.MapHttpRoute("DealApi", 
                    "api/{controller}/deal/{sessionId}",
                    new { action="Deal", sessionId = RouteParameter.Optional });


routes.MapHttpRoute("StandApi", 
                    "api/{controller}/stand/{sessionId}",
                    new { action="Stand", sessionId = RouteParameter.Optional });

さて、あなたのControllerクラスで:

[HttpGet]
[ActionName("Deal")]
public ClientData Deal(int sessionId){...}

[HttpGet]
[ActionName("Stand")]
public ClientData Stand(int sessionId){...}

これで、URL http://www.yourhost.com/api/deal/12345をプルアップするたびに、Deal関数が呼び出されます。スタンドも同じです。

ルートテーブルに設定するものはすべて、URLが有効かどうかを認識するためだけのものであることに注意してください。3番目のパラメーターでアクションを指定することにより、ActionName属性が指定したものに設定されている関数を見つけるようにWebApiに指示します。

もう1つ、デフォルトのAPIルートの前にこれらの2つのルートを配置します。

于 2012-12-15T23:15:24.430 に答える