你如何debuggingMVC 4 API路线最好?

我有一个WP7游戏,使用RESTsharp与我的MVC4 RESTful服务器进行通信,但我经常遇到问题,使请求工作,因此我想debugging失败的地方。

这是一个例子,我的GameController上的构造GameController被击中,但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对于确定哪些路由将会/不会被命中是很好的。

http://nuget.org/packages/routedebugger

另一种方法是在Global.asax.cs添加一个事件处理程序来获取传入的请求,然后查看VSdebugging器中的路由值。 重写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设置断点并查看showRouteValues的内容。

请记住,在Web API项目中,Http路由在WebApiConfig.cs ,而不在RouteConfig.cs

testing路线有更多的可能性。 您可以尝试手动testing或自动化作为unit testing的一部分。 手动testing:

  • RouteDebugger
  • MVC API跟踪

自动化testing:

  • MvcRouteTester 。

GameController是从ApiController派生的吗? 你在使用WebApi吗?

如果没有,那么我认为“/ api /”是为新的WebApifunction保留的。 尝试将您的路由和控制器名称更改为“gameapi”

如果你正在使用WebApi。

然后从你的BaseUrl中删除api

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