2016-07-25 6 views
0

Ich habe ein Web-API-Projekt, das eine Standardroute von "api/{controller}/{id}" verwendet, wobei "id" optional ist. In den meisten Fällen ist dies ausreichend, aber in einigen Fällen benötige ich Attribut-Routing. In diesem speziellen Fall habe ich "api/Customers/{customerID}/Orders/{orderID}", wo die Kundennummer benötigt wird und die Bestellnummer optional ist. Ursprünglich erforderte mein Code nur die Bestell-ID, aber ich brauchte einen Weg, um die Bestellungen für einen bestimmten Kunden zu ziehen, also benutzte ich eine Attribut-Route für meine Methoden, um dies zu ermöglichen.Fehler beim POST-Web-API-Endpunkt mit Attribut-Routing

Ich bin in der Lage, GET-Operationen ohne Problem durchzuführen, aber wenn ich versuche, eine POST-Operation zu machen, erhalte ich einen 500 Fehler. Was seltsam ist, ist, dass mein Objekt erstellt wird, so dass die Ausnahme, die ausgelöst wird, kommen muss, nachdem die Datenbankeinfügung erstellt wurde, aber ich kann dies nicht bestätigen, da mein Debugger nicht funktioniert. Meine API befindet sich in einem anderen Projekt als meine Benutzeroberfläche. Aus irgendeinem Grund kann ich meinen Debugger nicht im API-Projekt verwenden, sodass die von mir festgelegten Haltepunkte nicht funktionieren.

Die letzte Zeile Code in meiner POST-Methode ist dies:

return CreatedAtRoute("DefaultApi", new { id = order.ID }, order); 

Das erste Argument dieser Methode sind die Routennamen und die oben für die Standardroute in WebApiConfig.cs angegeben aufgeführt ist. Diese bestimmte Route unterscheidet sich jedoch von der Standardeinstellung:

[Route("api/Customers/{customerID:int}/Orders")] 

Könnte dies das Problem sein? Da die betreffende Route zwei Argumente verwendet, würde ich annehmen, dass ich sie im Argument routeValues ​​(second) für die CreatedAtRoute-Methode angeben müsste.

Was muss ich tun, damit dies funktioniert? Ich vermute, dass ich Probleme mit PUT- und DELETE-Operationen habe, aber ich muss ein Objekt erstellen, bevor ich es modifizieren oder löschen kann.

Antwort

0

Okay, ich habe das selbst gelöst. Ich muss das Attribut Name auf der Route festlegen und dieses als erstes Argument für CreatedAtRouteMethod verwenden. Ich musste nur die zwei Routenwerte angeben, die den beiden Methodenargumenten entsprechen. Ich konnte auch PUT- und DELETE-Operationen ohne Probleme durchführen.

[Route("api/Customers/{customerID:int}/Orders", Name = "Test")] 

return CreatedAtRoute("Test", new { customerID = customer.customerID, orderID = order.ID }, order);