2016-10-11 1 views
1

Je m'attends à un comportement suivant: lors de l'appel http://localhost:59060/api/games/ - il renvoie tous les jeux, lors de l'appel http://localhost:59060/api/games/aaa - il retourne tous les jeux où DeviceId = aaa.comment définir le routage pour l'application MVC lorsque obtenir prend un paramètre nullable

Actuellement quand je l'appelle http://localhost:59060/api/games/aaa ou http://localhost:59060/api/games/, l'erreur est:

Aucune ressource HTTP a été trouvé qui correspond à la demande URI http://localhost:59060/api/games/ Aucune action n'a été trouvé sur le contrôleur « Jeux » qui correspond à la demande.

Contrôleur

public class GamesController : ApiController 
{ 
    private List<Game> _GamesRepository; 

    public GamesController() 
    { 
     _GamesRepository = CreateGamesRepository(); 
    } 

    // GET api/Games/0xa16 
    public IEnumerable<Game> Get(string deviceId) 
    { 
     if (String.IsNullOrEmpty(deviceId)) 
     { 
      return _GamesRepository; 
     } 
     else 
     { 
      return _GamesRepository.Where(x => x.DeviceId == deviceId); 
     } 

    } 
} 

Configuration

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "ControllerDefault", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "ApiDefault2", 
      url: "api/{controller}/{action}/{deviceId}", 
      defaults: new { action = "get", deviceId = UrlParameter.Optional } 
     ); 

Modèle

public class Game 
{ 
    public int TaskId { get; set; } 
    public string SalesForceId { get; set; } 
    public string Name { get; set; } 
    public string Thumbnail { get; set; } 
    public string DeviceId { get; set; } 
} 

Répondre

1

Dans votre WebApiConfig classe, avant la route "DefaultApi" vous peut enregistrer votre itinéraire comme suit:

config.Routes.MapHttpRoute(
    name: "GetGamesRoute", 
    routeTemplate: "api/games/{deviceId}", 
    new { controller = "games", action = "get", deviceId = RouteParameter.Optional } 
); 

// This is the default route 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Aussi, assurez le paramètre deviceId option:

// GET api/Games/0xa16 
public IEnumerable<Game> Get(string deviceId = null)