2012-07-13 15 views
56

Tengo un juego WP7 que usa RESTsharp para comunicarse con mi servidor MVC4 RESTful, pero a menudo tengo problemas al hacer que las solicitudes funcionen y, por lo tanto, quiero depurar donde falla.¿Cómo se pueden depurar mejor las rutas MVC 4 API?

Este es un ejemplo donde se golpea el Constructor en mi GameController, pero el método Post no se golpea, y no entiendo por qué.

El código de cliente: Código

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

Servidor:

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

Mis rutas son así

 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 –

+0

¿No puedo ver la información del depurador cuando accedo a mi servicio RESTful a través de un emulador WP7? – Mech0z

Respuesta

30

RouteDebugger es bueno para averiguar qué rutas se/no serán golpeados.

http://nuget.org/packages/routedebugger

+0

Ya se propuso en los comentarios anteriores, pero no puedo ver cómo eso debería decirme dónde va mal ? http://www.gratisimage.dk/graphic/images/2012/July/13/C044_50005206.jpg esto es lo que obtengo con eso y loookign en api/game/{gameId} \t controller = game, gameId = the stuff I ¿debería funcionar? – Mech0z

+0

De acuerdo con su captura de pantalla, gameId no es opcional. Intenta incluir gameId y ve si llega a tu ruta ... –

+0

Ten en cuenta también que tu acción de publicación no puede aceptar un gameId opcional. Considere la posibilidad de hacerlo obligatorio o hacer que el parámetro sea nulo (int? GameId) o establecer un valor predeterminado (int gameId = 0). –

0

Está GameController se deriven de los ApiController? ¿Estás usando WebApi?

Si no, entonces creo que "/ api /" está reservado para la nueva función de WebApi. Intente cambiar su enrutamiento y nombre de controlador a "gameapi"

Sin embargo, si está utilizando WebApi.

Luego retire API de BaseUrl yor

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

Sí, lo tengo funcionando, pero es justo cuando tengo algunos que no funcionan No puedo encontrar una buena manera de hacerlo, pero mi controlador es así http://pastebin.com/qki60LyU – Mech0z

+0

Luego puedes usar RouteDebugger desde " flem s "link es lo mismo desde mi enlace :) Simplemente ejecútelo en su página que usa WP7, hágalo en el navegador. También puedes pensar en instalar Elmah - http://nuget.org/packages/elmah –

+0

Eso solo me da un archivo XML (por lo tanto, ahora información de routedebugger) y también cuando lo ejecuto llego a mi Get y no a mi publicación (que funciona bien) – Mech0z

2
+0

Tenga en cuenta que este paquete es para C#. No parece ser compatible con vb.net. –

+6

Intenté esto. No funcionó para mi proyecto ASP.NET MVC 5 con API web agregada. Luego, eché todo a perder mi proyecto cuando lo desinstalé Debido a sus muchas dependencias, considérelo solo para instalar. – Rap

+1

Se dañó incluso mi proyecto Web API 2 - ¿por qué una herramienta de depuración necesita agregar Razor, Twitter Bootstrap y otros complementos a un servicio web estrictamente JSON? Herramienta de Phil Haack es mejor, y muy mínimo. – Dai

69

Otra forma es añadir un controlador de eventos en Global.asax.cs para recoger la solicitud entrante y luego ver los valores de ruta en el depurador de VS. Reemplazar el método Init de la siguiente manera:

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

luego ponga un punto de interrupción en showRouteValues y observe el contenido de routeData.

Tenga en cuenta que en un proyecto de API web, las rutas Http están en WebApiConfig.cs, no en RouteConfig.cs.

+8

¡Rápido y sucio, justo lo que necesitaba! –

+0

Esto no escala a una solución con docenas/cientos de controladores. –

Cuestiones relacionadas