2010-04-19 10 views
1

[Désolé pour une question compliquée. Je crois que je vise .Net 2.0 (pour l'instant)]ASP.Net Comment appliquer le format d'URL HTTP get?

Salut, je suis un noob ASP.NET. Pour commencer, je construis une page qui analyse une chaîne d'URL et remplit une table dans une base de données. Je veux que la chaîne à proprement parler de la forme:

http://<server>:<port>/PageName.aspx?A=1&B=2&C=3&D=4&E=5 

L'ordre des arguments n'a pas d'importance, je ne veux pas que l'un d'eux manque, ou des extras. Voici ce que j'ai essayé (oui, il est laid, je veux juste faire fonctionner en premier):

#if (DEBUG) 
     // Maps parameter names to their human readable names. 
     // Used for error checking. 
     private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> { 
      { "A", "a"}, 
      { "B", "b"}, 
      { "C", "c"}, 
      { "D", "d"}, 
      { "E", "e"}, 
      { "F", "f"}, 
     }; 


     [Conditional("DEBUG")] 
     private void validateRequestParameters(HttpRequest request) 
     { 
      bool endResponse = false; 
      // Use foreach var 
      foreach (string expectedParameterName in paramNameToDisplayName.Keys) 
      { 
       if (request[expectedParameterName] == null) 
       { 
        Response.Write(String.Format("No parameter \"{0}\", aka {1} was passed to the configuration generator. Check your URL string/cookie.", 
         expectedParameterName, paramNameToDisplayName[expectedParameterName])); 
        endResponse = true; 
       } 
      } 
      // Use foreach var 
      foreach (string actualParameterName in request.Params) 
      { 
       if (!paramNameToDisplayName.ContainsKey(actualParameterName)) 
       { 
        Response.Write(String.Format("The parameter \"{0}\", was passed to the configuration generator, but it was not expected. Check your URL string/cookie.", 
         actualParameterName)); 
        endResponse = true; 
       } 
      } 
      if (endResponse) 
      { 
       Response.End(); 
      } 
     } 
#endif 

et il fonctionne bien, sauf qu'il se plaint de toutes sortes d'autres choses:

http://localhost:1796/AddStatusUpdate.aspx?X=0


Aucun paramètre "a", alias a été transmis au générateur de configuration. Vérifiez votre URL string/cookie. Aucun paramètre "B", alias b, n'a été transmis au générateur de configuration. Vérifiez votre chaîne d'URL/cookie. Aucun paramètre "C", alias c a été passé au générateur de configuration. Vérifiez votre URL string/cookie. Aucun paramètre "D", alias d, n'a été transmis au générateur de configuration. Vérifiez votre URL string/cookie.No paramètre "E", alias e a été transmis au générateur de configuration. Vérifiez votre chaîne d'URL/cookie. Aucun paramètre "F", alias f a été passé au générateur de configuration. Vérifiez votre chaîne d'URL/cookie. Le paramètre "X", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "ASP.NET_SessionId", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "ALL_HTTP" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "ALL_RAW", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "APPL_MD_PATH" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "APPL_PHYSICAL_PATH" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "AUTH_TYPE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "AUTH_USER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "AUTH_PASSWORD" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "LOGON_USER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "REMOTE_USER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_COOKIE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_FLAGS", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_ISSUER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_KEYSIZE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "CERT_SECRETKEYSIZE" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_SERIALNUMBER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_SERVER_ISSUER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "CERT_SERVER_SUBJECT" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CERT_SUBJECT", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CONTENT_LENGTH", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "CONTENT_TYPE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne URL/cookie.Le paramètre "GATEWAY_INTERFACE" a été transmis au générateur de configuration, mais il n'était pas attendu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTPS", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTPS_KEYSIZE" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTPS_SECRETKEYSIZE" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTPS_SERVER_ISSUER" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTPS_SERVER_SUBJECT" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "INSTANCE_ID" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "INSTANCE_META_PATH", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "LOCAL_ADDR" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "PATH_INFO", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "PATH_TRANSLATED" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "QUERY_STRING", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "REMOTE_ADDR" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "REMOTE_HOST", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "REMOTE_PORT" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "REQUEST_METHOD", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "SCRIPT_NAME" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "SERVER_NAME" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "SERVER_PORT" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "SERVER_PORT_SECURE" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "SERVER_PROTOCOL" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "SERVER_SOFTWARE" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "URL" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTP_CACHE_CONTROL" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTP_CONNECTION" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTP_ACCEPT" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL string/cookie. Le paramètre "HTTP_ACCEPT_CHARSET" a été transmis au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTP_ACCEPT_ENCODING", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTP_ACCEPT_LANGUAGE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTP_COOKIE", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTP_HOST", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre chaîne d'URL/cookie. Le paramètre "HTTP_USER_AGENT", a été passé au générateur de configuration, mais ce n'était pas prévu. Vérifiez votre URL/cookie.Thread a été abandonné.


Est-il possible pour moi de séparer les implicites et les paramètres explicites, ou est-ce pas faisable? Devrais-je même déranger? Peut-être que la philosophie de get est de simplement jeter ce qui n'est pas nécessaire.

Merci!

Répondre

1

Votre dictionnaire doit avoir une clé de chaîne, votre code ne pas "" autour des touches:

private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> { 
    { "A", "a"}, 
    { "B", "b"}, 
    { "C", "c"}, 
    { "D", "d"}, 
    { "E", "e"}, 
    { "F", "f"}, 

};

Pour le reste des erreurs, essayez d'utiliser cela, votre code CHERCHAIT tous affichés params, pas seulement les params querystring (de request.QueryString.AllKeys):

if (!request.QueryString.AllKeys.Contains<string>(expectedParameterName)) 
       { 
        Response.Write(String.Format("No parameter \"{0}\", aka {1} was passed to the configuration generator. Check your URL string/cookie.", expectedParameterName, paramNameToDisplayName[expectedParameterName])); 
        endResponse = true; 
       } 
+0

Merci! Il s'avère que j'ai besoin de génériques et de Linq pour que cela fonctionne. –

+0

QUESTION: comment puis-je obtenir Contient pour fonctionner avec un comparateur insensible à la casse? J'ai vu l'option pour le deuxième paramètre; Je ne sais pas quelle classe générique implémente cette interface et fait ce que je veux. Merci! –

+0

Request.QueryString.AllKeys.Contains (expectedParameterName, StringComparer.InvariantCultureIgnoreCase) – derek

1

Comme drousseau REPONSES, vous » ll faut utiliser la collection QueryString au lieu de Params. Params inclut TOUTES les données transmises sur la demande, ce qui signifie les cookies, les données POST de formulaire, les paramètres de chaîne de requête et les servervariables.

On dirait que vous vérifiez les cookies, donc vous devez soit faire un chèque séparé par cette collection, ou de fusionner les deux en utilisant quelque chose comme ceci:

 var both = (
      from key in Request.QueryString.AllKeys 
      select new { Key = key, Value = Request.QueryString[key] }).Union(
      from key in Request.Cookies.AllKeys 
      select new { Key = key, Value = Request.Cookies[key].Value }).ToDictionary(entry => entry.Key, entry => entry.Value); 

Il est également Il est à noter que vous allez également recevoir un cookie déposé par état de session ASP.NET. Vous pouvez le coder en ignorant explicitement les cookies nommés "ASP.NET_SessionId" (plus facile), ou simplement désactiver l'état de la session dans web.config - vous devrez cependant effacer vos cookies.

EDIT: juste vu le bit sur le ciblage 2.0, ce qui signifie que belle petite instruction LINQ est hors de question. Il serait probablement plus facile de vérifier chacune des collections (QueryString et Cookies) séparément.

EDIT PARTIE DEUX: est ici une alternative non-LINQ à l'aide d'une recherche simple:

 NameValueCollection both = new NameValueCollection(Request.QueryString); 
     foreach (String key in Request.Cookies.AllKeys) 
     { 
      if (key != "ASP.NET_SessionId") both.Add(key, Request.Cookies[key].Value); 
     } 

l'aide d'une chaîne codée en dur comme ce qui est laid, mais bon, il devrait fonctionner.

Je tiens également à souligner que si vous avez utilisé ASP.NET MVC ou même simplement System.Web.Routing (tous les deux nécessitent malheureusement .NET 3.5), vous ne devriez rien faire de tout cela, puisque le framework de routage fait tout pour vous - et vous obtiendrez des paramètres tapés pour démarrer!

+0

Daniel, je pourrais être en mesure de passer à la version 3.5 ou 4.0, MAIS je suis juste plonger dans ASP.Net et il y a un temps limité. Dans l'exemple LINQ - une fois que j'ai les deux, qu'est-ce que je fais avec? Aussi, comment exactement un cookie m'affecte-t-il? J'ai copié une partie du message d'erreur d'ailleurs mais je ne comprends pas comment un cookie arrive dans une pièce ici. Merci encore! –

+1

Utilisez le dictionnaire "both" pour itérer et faire vos contrôles au lieu de Request.Params. J'ai inclus les cookies, car ils sont mentionnés dans votre appel Response.Write. ASP.NET utilise quelque chose appelé état de session (http://msdn.microsoft.com/en-us/library/ms972429.aspx) pour conserver les données sur la session d'un utilisateur entre les demandes. La manière par défaut de le suivre est d'utiliser un cookie, qui est défini automatiquement. Ainsi, si vous vérifiez les cookies, le cookie de l'état de la session s'affichera automatiquement, ce qui signifie que vous devez en tenir compte si vous ne vous attendez qu'à ce que les valeurs spécifiées soient définies. –