【问题标题】:How do you debug MVC 4 API routes?你如何调试 MVC 4 API 路由?
【发布时间】:2012-07-13 14:58:42
【问题描述】:

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

【问题讨论】:

标签: c# .net asp.net-mvc rest asp.net-mvc-4


【解决方案1】:

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

【讨论】:

  • 又快又脏,正是我需要的!
  • 这不适用于具有数十个/数百个控制器的解决方案。
【解决方案2】:

RouteDebugger 可以很好地确定哪些路由会/不会被命中。

http://nuget.org/packages/routedebugger

【讨论】:

  • 已经在上面的 cmets 中提出,但我看不出它应该如何告诉我哪里出错了? gratisimage.dk/graphic/images/2012/July/13/C044_50005206.jpg 这就是我得到的结果并在 api/game/{gameId} controller = game, gameId = 我所做的工作应该工作?
  • 根据你的截图,gameId 不是可选的。尝试包含 gameId 并查看它是否符合您的路线...
  • 另请注意,您的 Post 操作不能接受可选的 gameId。考虑将其设为强制性或将参数设为可空 (int?gameId) 或设置默认值 (int gameId = 0)。
  • 将你的 post 参数重命名为 gameId。
  • 那不做任何事情(我只是重命名它,因为我尝试删除参数(我不使用它,只是为了尝试让它命中方法而添加))
【解决方案3】:

【讨论】:

  • 注意这个包是为 c# 的。好像不支持vb.net。
  • 试过这个。不适用于添加了 Web API 的 ASP.NET MVC 5 项目。然后,由于它的许多依赖项,当我卸载它时,我完全搞砸了我的项目。将其视为仅安装。
  • 它甚至搞砸了我的 Web API 2 项目 - 为什么调试工具需要将 Razor、Twitter Bootstrap 和其他附加组件添加到严格的 JSON 网络服务? Phil Haack 的工具更好,而且非常小。
  • 我不小心为错误的项目安装了包(只是一个 dll 库项目),无论如何都无法调试路由。因此,在我发现它不适用于 MVC 5 之后,我有两倍的剩余垃圾需要清理。
【解决方案4】:

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

自动化测试:

【讨论】:

    【解决方案5】:

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

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

    如果您使用的是 WebApi。

    然后从你的 BaseUrl 中删除 api

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

    【讨论】:

    • 是的,我有它的工作,但它只是当我有一些不工作的时候,我想不出一个好的方法,但我的控制器是这样的pastebin.com/qki60LyU
    • 然后您可以使用“flem s”链接中的 RouteDebugger,这与我的链接中的相同 :) 只需在 WP7 使用的页面上运行它,在浏览器中执行即可。你也可以考虑安装 Elmah - nuget.org/packages/elmah
    • 这只是给了我一个 XML 文件(因此现在来自 routedebugger 的信息),而且当我运行它时,我点击了我的 Get 而不是我的 Post(这工作正常)
    • 你的 Post 动作是由 [HttpPost] 属性修饰的吗?
    • No pastebin.com/qki60LyU 以前没有必要,我的 Get 请求工作,我只是尝试使用它但没有骰子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2012-09-28
    • 2012-12-14
    • 2012-09-26
    • 2017-03-25
    • 2014-05-25
    相关资源
    最近更新 更多