8
votes

WebAPI Plusieurs actions ont été trouvées avec Getallall () et GetByids (INT [] IDS)

Utilisation de l'itinéraire standard: xxx

avec ces actions: xxx

et faire une demande à / API / Valeurs , je reçois cette exception: xxx

J'ai filé mes roues essayant de trouver une solution autour de cela. C'est ma conviction que les actions getall et getByids sont considérées commees multiple ici, mais ils ne sont pas parce que les GetByids ont une signature différente.

Y a-t-il un travail autour de cela qui n'implique pas d'ajouter {action} à l'itinéraire?


2 commentaires

Pourriez-vous poster l'API route Web.config?


Ajouté @fals, c'est les bits standard


4 Réponses :


2
votes

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


0 commentaires

6
votes

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. xxx


1 commentaires

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 plutôt que ids.length == 0 . Je ne sais pas si c'était une modification apportée dans Web API 2, mais si j'appelle API / valeurs sans aucune valeur pour IDS , le tableau est NULL plutôt que vide.



0
votes
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 }
        );

2 commentaires

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.



2
votes

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";
    }


0 commentaires