私は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
}
);
RouteDebuggerは、どのルートがヒットするかしないかを判断するのに適しています。
別の方法は、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
にあることに注意してください。
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 /
ルートをテストするより多くの可能性があります。単体テストの一部として手動テストまたは自動化を試すことができます。手動テスト:
自動テスト:
GameControllerはApiControllerから派生していますか? WebApiを使用していますか?
そうでない場合、「/ api /」は新しいWebApi機能用に予約されていると思います。ルーティングとコントローラー名を「gameapi」に変更してみてください
ただし、WebApiを使用している場合。
次に、yor BaseUrlからapiを削除します
client = new RestClient
{
CookieContainer = new CookieContainer(),
BaseUrl = "http://localhost:21688/",
};