76

我有一个 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
            }             
        );
4

5 回答 5

113

另一种方法是添加一个事件处理程序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.

于 2014-08-23T21:25:23.427 回答
36

RouteDebugger 可以很好地确定哪些路线将/不会被击中。

http://nuget.org/packages/routedebugger

于 2012-07-13T16:44:54.077 回答
1

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

自动化测试:

于 2014-10-16T08:58:41.027 回答
1

您可以尝试 ASP.NET Web API 路由调试器。它是为 Web Api 编写的。https://trocolate.wordpress.com/2013/02/06/introducing-asp-net-web-api-route-debugger/ http://nuget.org/packages/WebApiRouteDebugger/

于 2013-03-04T08:26:07.210 回答
0

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

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

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

然后从你的 BaseUrl 中删除 api

  client = new RestClient
  {
      CookieContainer = new CookieContainer(),
      BaseUrl = "http://localhost:21688/",
  };
于 2012-07-13T16:41:41.170 回答