2012-07-13 18 views
56

我有一個WP7遊戲,使用RESTsharp與我的MVC4 RESTful服務器進行通信,但我經常遇到問題,使請求工作,因此我想調試它失敗的地方。如何最好地調試MVC 4 API路線?

這是一個例子,我的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) => 
    {}); 
} 

Server代碼:

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

http://haacked.com/archive/2008/03/13/url-routing-debugger。aspx – 2012-07-13 15:01:53

+0

當我通過WP7模擬器訪問我的RESTful服務時,無法看到調試器信息? – Mech0z 2012-07-13 15:27:22

回答

30

RouteDebugger有利於搞清楚哪些路由會/不會被擊中。

http://nuget.org/packages/routedebugger

+0

已經在上面的評論中提出,但我不知道如何告訴我它在哪裏出錯? http://www.gratisimage.dk/graphic/images/2012/July/13/C044_50005206.jpg這就是我得到的,並在api/game/{gameId} loookign \t controller = game,gameId =我的東西確實應該工作? – Mech0z 2012-07-13 16:52:02

+0

根據你的截圖,gameId不是可選的。嘗試包括gameId並查看它是否符合您的路線... – 2012-07-13 16:56:07

+0

還要注意您的發佈操作不能接受可選的gameId。考慮使其成爲強制參數或使參數爲空(int?gameId)或設置默認值(int gameId = 0)。 – 2012-07-13 16:58:34

0

是GameController從ApiController獲得? 你使用WebApi嗎?

如果沒有,那麼我認爲「/ api /」是爲新的WebApi功能保留的。嘗試將您的路由和控制器名稱更改爲「gameapi」

但是如果您使用的是WebApi。

然後從侑BASEURL刪除API

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

是的,我有它的工作,但它只是當我有一些不工作,我不能找出一個好辦法,但我的控制器是這樣的http://pastebin.com/qki60LyU – Mech0z 2012-07-13 16:44:49

+0

然後,你可以使用RouteDebugger從「 flem s「鏈接,它與我的鏈接相同:)只需在WP7使用的頁面上運行它,在瀏覽器中執行它。你也可以考慮安裝Elmah - http://nuget.org/packages/elmah – 2012-07-13 16:49:07

+0

這只是給我一個XML文件(因此現在的信息來自routedebugger),當我運行它時,我打我的獲取而不是我的帖子(其中工作正常) – Mech0z 2012-07-13 17:00:50

2
+0

注意這個軟件包是用於c#的,似乎不支持vb.net。 – 2013-03-21 04:20:43

+6

試過了。沒有爲我的ASP.NET MVC 5項目添加Web API的工作。然後我完全搞砸了我的項目,當我卸載它時 – Rap 2014-08-13 21:13:45

+1

即使我的Web API 2項目也搞砸了 - 爲什麼一個調試工具需要將Razor,Twitter Bootstrap和其他插件添加到嚴格的JSON Web服務中?Phil Haack的工具 – Dai 2016-09-01 01:54:18

69

另一種方式是在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

+8

快速和骯髒,正是我所需要的! – 2014-10-17 19:47:49

+0

這並沒有擴展到有數十個/數百個控制器的解決方案。 – 2017-04-21 04:29:42