2017-02-10 6 views
3

Ich habe die 2 folgenden Routen eingerichtet und sie funktionieren gut, wenn eine gültige Anfrage gesendet wird.Erlaube Zeichenfolge ID mit ASP.NET MVC Route

Ich wollte einige schlechte Anfrage testen, um sicherzustellen, dass die Antwort korrekt war. Ich versuche die folgende Aktion in meinem Controller aufzurufen.

public HttpResponseMessage Get(string id) 
{ 
    //output the id again 
} 

Wenn ich localhost:80/users/123 nennen, erhalte ich eine Antwort zurück, dass gültig ist und es wird ausgegeben 123. Wenn ich versuche, ein ungültiges ID zu verwenden, zum Beispiel eins, das Buchstaben enthält, schlägt es mit dem folgenden Fehler fehl.

{ „message“: „Nein HTTP-Ressource wurde gefunden, der die Anfrage übereinstimmt URI ‚http://localhost:80/users/d1g‘.“, „MessageDetail“: "Keine Aktion gefunden wurde auf dem Controller‚Benutzer‘, die den Namen übereinstimmt" d1g '. "}

Ich kann sehen, was schief geht. Diese Anfrage sollte mit der ersten Route übereinstimmen, aber mit der zweiten Route übereinstimmen. Ich habe 2 Methoden genannt Get. Man akzeptiert eine ID und die andere benötigt keine ID. Der eine, der keine ID erfordert, gibt eine Liste aller Datensätze zurück. Ich hatte eine Menge Probleme damit und auf dem obigen Weg habe ich das Problem gelöst.

+0

Es sollte nicht die erste Route übereinstimmen. Diese Route hat eine Einschränkung, die nur Nummern 'new {id = @" \ d + "}' für ID-Parameter erlaubt. Und das ist so, dass es nicht mit der zweiten Route Mapping kollidieren wird – Nkosi

+0

Ich denke, für Ihre erste GET haben Sie eine Maske hier angegeben: 'new {id = @" \ d + "}', versuchen Sie es zu entfernen. Aber ich denke auch, dass Sie nur eine Methode mit einer einfachen Entscheidung haben sollten: Wenn 'ID' übergeben wird, dann geben Sie ein Objekt zurück, sonst geben Sie eine Liste zurück. Aber ich würde einen anderen Weg nehmen. –

+0

Wenn ich die Einschränkung entferne, erhalte ich einen Fehler "Es wurden mehrere Aktionen gefunden, die der Anfrage entsprechen: \ r \ nSystem.Net.Http.HttpResponseMessage Get()". Dies macht Sinn, da ich 2 Methoden habe. Eine, die eine ID nimmt und eine andere, die keine nimmt, um eine Liste von Datensätzen zurückzugeben –

Antwort

2

Aktualisieren Sie die Routen, indem Sie die Einschränkung entfernen, aktualisieren Sie die Route mit einer Aktion, um Konflikte zu vermeiden, und wechseln Sie dann die Reihenfolge.

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}" 
    new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional } 
); 
+0

Dies löst das Problem, aber es erzeugt wiederum das gleiche Problem, das ich zuvor hatte. Es wurden mehrere Aktionen gefunden, die der Anfrage entsprechen: \ r \ nSystem.Net.Http.HttpResponseMessage Get() für den Typ. Ich will, dass ein Controller so funktioniert/controller/= call get(),/controller/id = call get (String-ID) –

+0

Bingo, das macht den Job. Weiß nicht, warum, aber ich dachte, dass das Hardcoding der Action Probleme verursachen würde, aber das scheint perfekt zu funktionieren –