你如何调试MVC 4 API路由?

时间:2012-07-13 14:58:43

标签: c# .net asp.net-mvc rest 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) =>
  {});
}

服务器代码:

    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
            }             
        );

5 个答案:

答案 0 :(得分:89)

另一种方法是在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

答案 1 :(得分:34)

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

http://nuget.org/packages/routedebugger

答案 2 :(得分:1)

答案 3 :(得分:1)

测试路线的可能性更大。您可以尝试手动测试或自动作为单元测试的一部分。 手动测试:

自动测试:

答案 4 :(得分:0)

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

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

但是,如果您使用的是WebApi。

然后从yor BaseUrl中删除api

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