Utilisation de l'itinéraire standard: avec ces actions: p> et faire une demande à / API / Valeurs strong>, je reçois cette exception: p> J'ai filé mes roues essayant de trouver une solution autour de cela. C'est ma conviction que les actions forte> getall strong> et Y a-t-il un travail autour de cela qui n'implique pas d'ajouter {action} code> à l'itinéraire? p> p>
4 Réponses :
Nous n'avons actuellement pas de support sur la boîte à la collecte de valeurs contraignante provenant d'URI. Voici la question concernant que et aussi le problème d'action de désambiguïssement:
http://aspnetwebstack.codeplex.com / Workitem / 322 P>
Malheureusement, je ne peux pas penser à un travail relié au problème de sélection des actions (sans «{action}») même si vous résolvez le problème de la modélisation de la collecte Utilisation d'une liaison de paramètres personnalisée comme ci-dessous: P>
public string GetByIds(int[] ids) { return "multiple"; } ------------------------ config.ParameterBindingRules.Insert(0, typeof(int[]), (paramDesc) => new SampleParameterBinding(paramDesc)); ------------------------- public class SampleParameterBinding : HttpParameterBinding { public SampleParameterBinding(HttpParameterDescriptor desc) : base(desc) { } public override bool WillReadBody { get { return false; } } public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) { HttpRequestMessage currentRequest = actionContext.Request; NameValueCollection nvc = currentRequest.RequestUri.ParseQueryString(); //TODO: ERROR CHECKS int[] ids = nvc["ids"].Split(',').Select(str => Int32.Parse(str)).ToArray(); // Set the binding result here SetValue(actionContext, ids); // now, we can return a completed task with no result TaskCompletionSource<AsyncVoid> tcs = new TaskCompletionSource<AsyncVoid>(); tcs.SetResult(default(AsyncVoid)); return tcs.Task; } private struct AsyncVoid { } }
Merci pour l'entrée tout le monde. Après avoir coupé les options, la seule façon dont j'ai trouvé cela, est de combiner l'action Getall et GetByids et basculer la longueur des identifiants.
Ceci est également la seule solution que j'ai trouvée pour l'API Web 2. Cependant, dans mon cas, je dois vérifier IDS == null code> plutôt que
ids.length == 0 code>. Je ne sais pas si c'était une modification apportée dans Web API 2, mais si j'appelle
API / valeurs code> sans aucune valeur pour
IDS code>, le tableau est
NULL code> plutôt que vide.
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
C'est un hack. Pourquoi utilisez-vous WebAPI si vous n'êtes pas intéressant dans la construction d'une API de ressource? Mettre l'action dans l'URL détruit l'orthogonalité du verbe et de l'URL que http / repose est destiné à avoir; Vous pourriez également simplement utiliser MVC, qui est créé pour ce type de RPC.
De plus, vous n'avez vraiment pas besoin de publier des blocs de code sans une sorte de texte explicatif.
Je recommanderais un routage d'attribut:
[RoutePrefix("api")] public class ValuesController : ApiController { // GET api/values // GET api/values?ids=1&ids=2 [Route("values")] public string GetCollection([FromUri] IList<int> ids) { if (ids == null) { return "all"; } return "multiple"; } // GET api/values/5 [Route("values/{id:int}")] public string GetById(int id) { return "single"; }
Pourriez-vous poster l'API route Web.config?
Ajouté @fals, c'est les bits standard