2012-04-06 10 views
9

Ich habe versucht, eine zweite POST-Methode auf den Standard ValuesController Klasse hinzuzufügen, die ein ID-Parameter übernehmen und auf die PUT-Methode identisch handeln, etwa so:ASP.NET Web API - Mehrere POST-Methoden auf einem Controller?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Http; 
using System.Web.Http; 

namespace WebCalendar.Controllers { 
    public class ValuesController : ApiController { 
     // GET /values 
     public IEnumerable<string> Get()    { 
      return new string[] { "value1", "value2" }; 
     } 

     // GET /values/5 
     public string Get(int id) { 
      return "value"; 
     } 

     // POST /values 
     public void Post(string value) { 
     } 

     // POST /values/5 
     public void Post(int id, string value) { 
      Put(id, value); 
     } 

     // PUT /values/5 
     public void Put(int id, string value){ 
     } 

     // DELETE /values/5 
     public void Delete(int id) { 
     } 
    } 
} 

Problem ist, wenn ich diese zweite hinzufügen post-Methode, ich jederzeit eine POST-Anforderung machen, erhalte ich die Fehlermeldung:

"No action was found on the controller 'values' that matches the request." 

Wenn ich eine der Methoden auf Kommentar (keine Rolle spielt, welche), POST mit dem anderen Verfahren arbeitet. Ich habe versucht, die Methoden umzubenennen und sogar [HttpPost] auf beiden von ihnen zu verwenden, aber nichts hat funktioniert.

Wie kann ich mehr als eine POST-Methode in einem einzigen ApiController haben?

EDIT

Hier ist der einzige Weg, die ich verwende:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { controller = "values", id = RouteParameter.Optional } 
); 
+2

Können Sie bitte posten Sie Ihre Routen? –

+0

Keine Begrenzung für wie viele Post-Methoden Sie auf dem Controller haben können. Ich vermute, dass es sich um ein Routing-Problem handelt. – TGH

+0

Wie lautet die URL, die Sie anrufen, damit dies fehlschlägt? Was passiert, wenn Sie eine Abfragezeichenfolge für value angeben? Ich denke, das Problem ist, dass der Value-Parameter da sein muss, damit das Routing funktioniert, da es nicht als optional gekennzeichnet ist. –

Antwort

7

Sie haben die Aktion in Ihre Route aufzunehmen:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
+0

Dies als eine Antwort markieren (weil es funktioniert) , aber was ich nicht verstehe, ist: Warum ist die Aktion erforderlich? Die zwei separaten Get-Methoden funktionieren ohne sie, also warum muss ich sie für die Post-Methoden hinzufügen? – Isaac

+2

Wenn Sie den Wertparameter vom ersten POST entfernen, funktioniert er ohne explizite Angabe der Aktion, aber Sie können keine Daten posten. Sie können Posts nur mit eindeutigen URIs behandeln. –

+0

Es funktioniert mit Get, weil {id} ein optionaler Routenparameter ist. Also Werte/erhalten Routen zu Get() und Werte/get/1 Routen zu Get (int). Sie müssen die Route wirklich manuell definieren. –