2012-04-06 45 views
9

He estado tratando de añadir un segundo método POST a la clase ValuesController por defecto que toma un parámetro id y actuar idéntico al método PUT, así:ASP.NET Web API: ¿Múltiples métodos POST en un controlador?

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) { 
     } 
    } 
} 

El problema es que cuando agrego esta segunda método post, cada vez que hago una petición POST, me sale el error:

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

Si comento hacia fuera uno de los métodos (no importa cuál), POST trabajará con el otro método. He intentado cambiar el nombre de los métodos, e incluso usando [HttpPost] en ambos, pero nada ha funcionado.

¿Cómo puedo tener más de un método POST en un solo ApiController?

EDITAR

Esta es la única ruta que estoy usando:

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

¿Puede usted por favor, puesto que su rutas? –

+0

No hay límite para la cantidad de métodos de publicación que puede tener en el controlador. Sospecho que es un problema de enrutamiento – TGH

+0

¿Cuál es la URL que está llamando para que esto falle? ¿Qué sucede si proporciona una cadena de consulta para el valor? Creo que el problema es que el parámetro de valor debe estar ahí para que la ruta funcione, ya que no está marcada como opcional. –

Respuesta

7

Usted tiene que incluir la acción en su ruta:

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

Marcando esto como una respuesta (porque funciona) , pero lo que no entiendo es: ¿por qué se requiere la acción? Los dos métodos Get independientes funcionan sin él, así que ¿por qué tengo que agregarlo para los métodos Publicar? – Isaac

+2

Si elimina el parámetro de valor del primer POST, funcionaría sin especificar la acción explícitamente, pero no podría publicar ningún dato. Puede manejar publicaciones solo con URI únicos. –

+0

Funciona con Get porque {id} es un parámetro de ruta opcional. Así que valora/obtiene rutas para obtener() y valores/obtener/1 rutas para obtener (int). Realmente necesita definir manualmente la ruta. –