你如何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对于确定哪些路由将会/不会被命中是很好的。
另一种方法是在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
。
您可以尝试ASP.NET Web API路由debugging器。 它是为Web Api编写的。 https://trocolate.wordpress.com/2013/02/06/introducing-asp-net-web-api-route-debugger/ http://nuget.org/packages/WebApiRouteDebugger/
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/", };