web-dev-qa-db-fra.com

Comment déboguez-vous les routes de l'API MVC 4?

J'ai un jeu WP7 qui utilise RESTsharp pour communiquer avec mon serveur MVC4 RESTful, mais j'ai souvent des problèmes pour faire des demandes qui fonctionnent et je veux donc déboguer là où il échoue.

C'est un exemple où le constructeur sur mon GameController est frappé, mais la méthode Post n'est pas frappée, et je ne comprends pas pourquoi.

Code client:

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

Code serveur:

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

Mes itinéraires sont comme ça

       routes.MapHttpRoute(
            name: "gameAPI",
            routeTemplate: "api/game/{gameId}",
            defaults: new
            {
                controller = "game",
                gameId = RouteParameter.Optional
            }             
        );
68
Mech0z

RouteDebugger est bon pour déterminer quelles routes seront/ne seront pas atteintes.

http://nuget.org/packages/routedebugger

34
Paul Fleming

Une autre façon consiste à ajouter un gestionnaire d'événements dans Global.asax.cs pour récupérer la demande entrante, puis consulter les valeurs de route dans le débogueur VS. Remplacez la méthode Init comme suit:

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

Définissez ensuite un point d'arrêt dans showRouteValues et examinez le contenu de routeData.

Gardez à l'esprit que dans un projet d'API Web, les routes Http sont dans WebApiConfig.cs, ne pas RouteConfig.cs.

93
Paul Evans
1
Troy Dai

Il existe plus de possibilités pour tester les itinéraires. Vous pouvez essayer des tests manuels ou automatisés dans le cadre de tests unitaires. Test manuel:

Tests automatisés:

1
Andree

GameController dérive-t-il d'ApiController? Utilisez-vous WebApi?

Sinon, je pense que le "/ api /" est réservé à la nouvelle fonctionnalité WebApi. Essayez de changer votre nom de routage et de contrôleur en "gameapi"

Si toutefois vous utilisez WebApi.

Ensuite, supprimez l'api de yor BaseUrl

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