web-dev-qa-db-ja.com

MVC 4 APIルートをどのようにデバッグしますか?

私はMVC4 RESTfulサーバーと通信するためにRESTsharpを使用するWP7ゲームを持っていますが、動作するリクエストを作成する際に問題が発生することが多いため、失敗した場所をデバッグしたいと思います。

これは、私のGameControllerのConstructorはヒットするが、Postメソッドはヒットしない例であり、その理由はわかりません。

クライアントコード:

public void JoinRandomGame()
{
  client = new RestClient
  {
      CookieContainer = new CookieContainer(),
      BaseUrl = "http://localhost:21688/api/",
  };

  client.Authenticator = GetAuth();

  RestRequest request = new RestRequest(Method.POST)
  {
      RequestFormat = DataFormat.Json,
      Resource = "game/"

  };

  client.PostAsync(request, (response, ds) =>
  {});
}

サーバーコード:

    public void Post(int id)
    {
        if (ControllerContext.Request.Headers.Authorization == null)
        {
            //No auth
        }
        if (!loginManager.VerifyLogin(ControllerContext.Request.Headers.Authorization.Parameter))
        {
            //Failed login
        }

        string username;
        string password;
        LoginManager.DecodeBase64(ControllerContext.Request.Headers.Authorization.Parameter, out username, out password);
        gameManager.JoinRandomGame(username);
    }

私のルートはこんな感じ

       routes.MapHttpRoute(
            name: "gameAPI",
            routeTemplate: "api/game/{gameId}",
            defaults: new
            {
                controller = "game",
                gameId = RouteParameter.Optional
            }             
        );
68
Mech0z

RouteDebuggerは、どのルートがヒットするかしないかを判断するのに適しています。

http://nuget.org/packages/routedebugger

34
Paul Fleming

別の方法は、Global.asax.csにイベントハンドラーを追加して着信要求を取得し、VSデバッガーでルート値を確認することです。次のようにInitメソッドをオーバーライドします。

public override void Init()
{
    base.Init();
    this.AcquireRequestState += showRouteValues;
}

protected void showRouteValues(object sender, EventArgs e)
{
    var context = HttpContext.Current;
    if (context == null)
        return;
    var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context)); 
}

次に、showRouteValuesにブレークポイントを設定し、routeDataの内容を確認します。

Web APIプロジェクトでは、HttpルートはWebApiConfig.csではなくRouteConfig.csにあることに注意してください。

93
Paul Evans

ASP.NET Web API Route Debuggerを試すことができます。 Web Api用に書かれています。 https://trocolate.wordpress.com/2013/02/06/introducing-asp-net-web-api-route-debugger/http://nuget.org/packages/WebApiRouteDebugger /

1
Troy Dai

ルートをテストするより多くの可能性があります。単体テストの一部として手動テストまたは自動化を試すことができます。手動テスト:

自動テスト:

1
Andree

GameControllerはApiControllerから派生していますか? WebApiを使用していますか?

そうでない場合、「/ api /」は新しいWebApi機能用に予約されていると思います。ルーティングとコントローラー名を「gameapi」に変更してみてください

ただし、WebApiを使用している場合。

次に、yor BaseUrlからapiを削除します

  client = new RestClient
  {
      CookieContainer = new CookieContainer(),
      BaseUrl = "http://localhost:21688/",
  };
0
Michal Franc