C# 如何调试MVC4API路由?

C# 如何调试MVC4API路由?,c#,.net,asp.net-mvc,rest,asp.net-mvc-4,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(),

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

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

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

但是,如果您使用的是WebApi

然后从你的BaseUrl中删除api

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

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


您可以尝试ASP.NET Web API路由调试器。它是为webapi编写的。

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

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

自动测试:


当我通过WP7模拟器访问我的RESTful服务时,我看不到调试器信息?是的,我让它工作,但只是当我有一些不工作时,我想不出一个好方法来做,但我的控制器是这样的,那么你可以使用“flem s”中的RoutedBugger链接我的链接也是一样:)只需在WP7使用的页面上运行它,在浏览器中运行即可。你也可以考虑安装Elmah,它只给了我一个XML文件(因此现在是RoutedBugger提供的信息),而且当我运行它时,我点击的是我的Get而不是我的Post(工作正常),你的Post操作是由[HttpPost]属性修饰的吗?以前没有必要,我的Get请求工作正常,我只是尝试使用它,但上面的评论中没有提出任何建议,但我看不出该如何告诉我哪里出了问题?这就是我在api/game/{gameId}controller=game,gameId=上得到的结果,我做的东西应该可以用?根据你的截图,gameId不是可选的。尝试包含gameId,看看它是否符合您的路线……还要注意,您的Post操作无法接受可选gameId。考虑强制或使参数可空(INT.GAMIID)或设置默认值(int GAMIDID=0)。将POST参数重命名为GAMIDID。这不做任何事(我只重命名它是因为我尝试删除参数(我不使用它,只是添加来尝试它来命中方法))请注意这个包是针对C。似乎不支持vb.net。请尝试此操作。无法用于添加了Web API的ASP.NET MVC 5项目。然后当我卸载我的项目时,由于它有很多依赖项,我把它完全搞砸了。考虑它的安装。它甚至搞乱了我的Web API 2项目-为什么调试工具需要添加剃刀,推特引导和其他附加到严格的JSON WebService?Phil Haack的工具更好,而且非常简单。我不小心为错误的项目安装了包(只是一个dll库项目),无论如何都无法调试路由。所以,当我发现MVC5不起作用后,我有两倍多的剩余垃圾要清理。又快又脏,正是我需要的!这无法扩展到具有数十个/数百个控制器的解决方案。