你如何调试MVC 4 API路由?

Mec*_*h0z 68 .net c# rest asp.net-mvc asp.net-mvc-4

我有一个WP7游戏,它使用RESTsharp与我的MVC4 RESTful服务器进行通信,但是我经常遇到使请求有效的问题,因此我想调试它失败的地方.

这是一个示例,其中我的构造函数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) =>
  {});
}
Run Code Online (Sandbox Code Playgroud)

服务器代码:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

我的路线是这样的

       routes.MapHttpRoute(
            name: "gameAPI",
            routeTemplate: "api/game/{gameId}",
            defaults: new
            {
                controller = "game",
                gameId = RouteParameter.Optional
            }             
        );
Run Code Online (Sandbox Code Playgroud)

Pau*_*ans 98

另一种方法是添加一个事件处理程序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)); 
}
Run Code Online (Sandbox Code Playgroud)

然后设置一个断点showRouteValues并查看其中的内容routeData.

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

  • 快速而肮脏,正是我需要的! (13认同)

Pau*_*ing 34

RouteDebugger有助于确定哪些路线将被击中/不被击中.

http://nuget.org/packages/routedebugger