En Web API tuve una clase de estructura similar:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Como pudimos mapear métodos individuales, fue muy simple obtener la solicitud correcta en el lugar correcto. Para una clase similar que solo tenía un GET
método único pero también tenía un Object
parámetro, utilicé con éxito IActionValueBinder
. Sin embargo, en el caso descrito anteriormente me sale el siguiente error:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Estoy tratando de abordar este problema anulando el ExecuteAsync
método ApiController
pero hasta ahora sin suerte. ¿Algún consejo sobre este tema?
Editar: Olvidé mencionar que ahora estoy tratando de mover este código en la API web ASP.NET que tiene un enfoque diferente para el enrutamiento. La pregunta es, ¿cómo hago que el código funcione en la API web ASP.NET?
c#
asp.net-web-api
paulius_l
fuente
fuente
Respuestas:
Esta es la mejor manera que he encontrado para admitir métodos GET adicionales y también para los métodos REST normales. Agregue las siguientes rutas a su WebApiConfig:
Verifiqué esta solución con la clase de prueba a continuación. Pude acertar con éxito cada método en mi controlador a continuación:
Verifiqué que admite las siguientes solicitudes:
Tenga en cuenta que si sus acciones GET adicionales no comienzan con 'Obtener', es posible que desee agregar un atributo HttpGet al método.
fuente
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
para miPut
método, de lo contrario me estaba dando 404.Ir de esto:
A esto:
Por lo tanto, ahora puede especificar a qué acción (método) desea enviar su solicitud HTTP.
la publicación en "http: // localhost: 8383 / api / Command / PostCreateUser" invoca:
y publicando en "http: // localhost: 8383 / api / Command / PostMakeBooking" invoca:
Probé esto en una aplicación de servicio de API WEB alojada y funciona de maravilla :)
fuente
[HttpGet]
,[HttpPost]
, etc. atributos para mapear el verbo al método.Creo que los atributos son más limpios de usar que agregarlos manualmente a través del código. Aquí hay un ejemplo simple.
También necesita esto en su webapiconfig
Algunos buenos enlaces http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Este explica la ruta mejor. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
fuente
config.MapHttpAttributeRoutes();
a miWebApiConfig.cs
, yGlobalConfiguration.Configuration.EnsureInitialized();
al final de miWebApiApplication.Application_Start()
método para que los atributos de ruta funcionen.config.MapHttpAttributeRoutes();
debe aparecer antes del mapeo de la ruta (por ejemplo, antesconfig.Routes.MappHttpRoute(...
.Debe definir más rutas en global.asax.cs como esta:
fuente
Con la nueva Web Api 2 se ha vuelto más fácil tener múltiples métodos get.
Si el parámetro pasado a los
GET
métodos es lo suficientemente diferente para que el sistema de enrutamiento de atributos distinga sus tipos, como es el caso deint
syGuid
s, puede especificar el tipo esperado en el[Route...]
atributoPor ejemplo -
Para obtener más detalles sobre este enfoque, consulte aquí http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Otra opción es dar a los
GET
métodos diferentes rutas.Ver aquí para más detalles: http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
fuente
En ASP.NET Core 2.0 puede agregar el atributo Ruta al controlador:
fuente
Intenté utilizar el enrutamiento de atributos de Web Api 2 para permitir múltiples métodos Get, e incorporé las sugerencias útiles de respuestas anteriores, pero en el controlador solo había decorado el método "especial" (ejemplo):
... sin también colocar un [RoutePrefix] en la parte superior del Controlador:
Recibía errores que indicaban que no se encontró ninguna ruta que coincida con el URI enviado. Una vez que tuve tanto la [Ruta] que decoraba el método como la [RutaPrefijo] que decoraba el Controlador en su conjunto, funcionó.
fuente
No estoy seguro de haber encontrado la respuesta, pero hice esto y funciona
Ahora en global.asx
fuente
¿Has intentado cambiar a WebInvokeAttribute y configurar el Método en "GET"?
Creo que tuve un problema similar y cambié a decir explícitamente qué método (GET / PUT / POST / DELETE) se espera en la mayoría de mis métodos, si no en todos.
El WebGet debería manejarlo, pero he visto que tiene algunos problemas con múltiples Obtener mucho menos múltiples Obtener del mismo tipo de retorno.
[Editar: nada de esto es válido con la puesta de sol de WCF WebAPI y la migración a ASP.Net WebAPI en la pila MVC]
fuente
fuente
La alternativa perezosa / apresurada (Dotnet Core 2.2):
Llamándolos:
"hola42"
"world99"
fuente
Ninguno de los ejemplos anteriores funcionó para mis necesidades personales. Lo siguiente es lo que terminé haciendo.
Para usar lo anterior en su ruta use:
Lo que sucede es el tipo de restricción de falsificaciones en el método para que esta ruta solo coincida con los métodos predeterminados GET, POST, PUT y DELETE. El "verdadero" dice que queremos verificar si hay una coincidencia de los elementos en la matriz. Si fuera falso, estaría diciendo que excluya a los que están en la cadena.Puede usar rutas por encima de este método predeterminado como:
En lo anterior, esencialmente está buscando la siguiente URL =>
http://www.domain.com/Account/Status/Active
o algo así.Más allá de lo anterior, no estoy seguro de volverme loco. Al final del día, debe ser por recurso. Pero sí veo la necesidad de mapear las URL amigables por varias razones. Me siento bastante seguro a medida que Web Api evoluciona, habrá algún tipo de provisión. Si es tiempo, construiré una solución más permanente y publicaré.
fuente
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
en su lugar.No se pudo hacer que ninguna de las soluciones de enrutamiento anteriores funcionara; parte de la sintaxis parece haber cambiado y todavía soy nuevo en MVC, en un apuro aunque armé este truco realmente horrible (y simple) que me atrapará por ahora, tenga en cuenta que esto reemplaza el método "public MyObject GetMyObjects (long id)": cambiamos el tipo de "id" a una cadena y cambiamos el tipo de retorno a object.
fuente
Si tiene varias acciones dentro del mismo archivo, pase el mismo argumento, por ejemplo, Id, a todas las acciones. Esto se debe a que la acción solo puede identificar Id, por lo tanto, en lugar de dar un nombre al argumento, solo declare Id de esta manera.
fuente
Alternativa simple
Solo usa una cadena de consulta.
Enrutamiento
Controlador
Peticiones
Nota
Tenga en cuenta que el parámetro de cadena de consulta no debe ser "id" o cualquiera que sea el parámetro en la ruta configurada.
fuente
Modifique el WebApiConfig y agregue al final otras Rutas. MapHttpRoute así:
Luego cree un controlador como este:
Así es como lo resolví. Espero que ayude a alguien.
fuente