web-dev-qa-db-fra.com

Vous accédez à la chaîne de requête dans ASP.Net Web Api?

J'utilise le modèle par défaut généré par Asp.net Web Api. Je travaille avec la partie Get ():

        // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

Pour une raison quelconque, je pensais que la seule chose que vous deviez faire pour accéder à la chaîne de requête était simplement de créer une variable de chaîne d'entrée. J'ai donc créé une fonction supplémentaire (la seule modification que j'ai apportée) au contrôleur par défaut généré:

        public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }

J'ai mis un point d'arrêt dans les deux méthodes, mais même si j'ajoute une chaîne de requête, il va toujours à la fonction sans paramètres. Donc, si je vais à http://mybaseurl/api/values?foo=f, Il va toujours à Get () au lieu de get (string queryString). Ça ne marche pas comme je le pensais? Je sais que je peux accéder à la chaîne de requête dans la fonction Get () en utilisant Request.RequestUri.ParseQueryString(); mais je préfère la séparer comme ceci si possible.

39
coding4fun

Le nom de clé de la chaîne de requête doit correspondre au nom du paramètre de l'action:

/ api/values? queryString = f

public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
40
Kiran Challa

Même si @ Kiran Challa la réponse est correcte, il y a peu de situations que vous préféreriez obtenir les paramètres d'URL directement à partir de l'URL. dans ces scénarios, essayez ceci:

using System.Net.Http;

var allUrlKeyValues = ControllerContext.Request.GetQueryNameValuePairs();

string p1Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p1").Value;
string p2Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p2").Value;
string p3Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p3").Value;

Maintenant, pour l'URL suivante, p1Val sera "Apple", p2Val sera "Banana" et p3Val sera null.

.../api/myController?p1=Apple&p2=Banana

Mise à jour:

Merci pour les suggestions, maintenant, le code source de ce test est dans GitHub et il s'exécute également et peut être testé sur Azure:

53
Tohid