2016-10-29 2 views
0

Ich habe einen WebApiController, die zwei Get-Methode implementiert: eine, die keinen Parameter und die andere Methode einen interger Parameter erfordert erfordert ...WebApiConfig & was ist der Unterschied zwischen Routen

//Get api/<controller> 
    public IEnumerable<EmployeeVM> Get() 
    { 
     List<EmployeeVM> list = new List<EmployeeVM>() 
     { 
      new EmployeeVM(){ 
       FullName = "Milton Waddams" 
      }, 
     new EmployeeVM(){ 
       FullName = "Andy Bernard" 
      } 
     }; 
     return list; 
    } 

    //Get api/<controller> 
    public string Get(int id) 
    { 
     return "value"; 
    } 

Wenn ich das verwenden folgende Konfiguration in meiner WebApiConfig Klasse,

configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional }); 

dann würde ich die folgende Fehlermeldung erhalten:

"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'AngularForMVC.Controllers.EmployeeWebApiController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."

Jetzt

wenn ich das diese folgende Konfiguration:

configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }); 

dann funktioniert es. Ich kann die Methode Get() ohne Fehler ausführen.

Was ist der Unterschied? Warum funktioniert der zweite Code-Verweis? Ich weiß, dass ich dem URL-Pfad eine {action} hinzugefügt habe, aber selbst wenn ich den {action} Pfad zur URL nicht angegeben hätte, sollte dies trotzdem funktionieren.

+0

Können Sie uns die Implementierung von Application_Start in global.asax.cs zeigen? Stellen Sie sicher, dass die Web-API-Routenregistrierung vor der MVC-Routenregistrierung aufgerufen wird. – CodeNotFound

Antwort

0

Sie sollten den ID-Parameter als nullable int angeben. Holen (int id)

+0

Der Nullable-Parameter wird nicht helfen, wenn zwei Funktionen die gleiche Webmethode haben –

+0

Gerade auf die Fehlermeldung hingewiesen, die er erhalten hat – Faisal

0

Eine benutzerdefinierte [Route] wäre aus mehreren Gründen besser sein

1-Ist zu identifizieren, was jede Anforderung GET tun soll. zum Beispiel, wenn Sie [Route("api/getlist")] und [Route("api/getitem/{id}")] haben, wäre dies aussagekräftiger.

2 - Sie werden das Problem, mit dem Sie konfrontiert sind, nicht konfrontieren.

Verwandte Themen