2009-02-03 7 views
2

J'ai un problème avec l'entreprise qui utilise un système de suivi d'entreprise qui capture la première visite d'un utilisateur et la redirige vers la page qu'elle essayait de visiter mais avec un URL de la redirection jointe ... Maintenant que l'URL de renvoi porte l'URL que la personne essayait de visiter (ne demandez pas pourquoi, je ne sais pas), il me fait avoir une copie de chaque valeur.Quel est le moyen le plus rapide de dédupliquer une chaîne en C# (ASP.net)

donc visiter cette ...

home.aspx? Test = test de & test2 = test2

devient

home.aspx? Test = test de & test2 = test2 & referrerurl = home.aspx? test = test & test2 = test2

Non w, URL Encoding le référant permettrait de trier le problème, mais j'ai plus de chance d'être molesté par un gorille; donc la question est là. Comment dédoubler la sortie de .QueryString?

Actuellement, je suis en utilisant ce ...

private string queryClean(string entity) 
{ 
    try 
    { 
     if(Request.QueryString["referrerUrl"] != null){ 
     string[] Split = entity.Split(new Char[] { ',' }); 
     string tmpValue = Convert.ToString(Split[0]); 

     return tmpValue; 
     }else{ return entity; } 
    } 
    catch (Exception cleanError) 
    { 
     errors.Text += "-clean-" + cleanError + "-endclean-"; 
     return entity; 
    } 

} 

(ignorer l'try/catch nous avons erreur de niveau app attraper, mais je suis toujours à jouer avec elle).

J'utilise C# .net 2

Merci


[Informations supplémentaires]

Le reffererURL sera toujours à la fin de la chaîne de sorte qu'il pourrait être possible de supprimer toute la chaîne de requête après ce point?

J'ai essayé d'utiliser

string test = Convert.ToString(Request.QueryString); 
string[] tRSplit = Regex.Split(test, "&referrerUrl"); 
Response.Write(tRSplit[0]); 

et ...

System.Collections.Generic.List<string> testb = new System.Collections.Generic.List<string>(Convert.ToString(Request.QueryString).Split('&')); 
      for (int i = 0; i < testb.Count; i++) 
      { 

       Response.Write(i +": "+ testb[i].ToString()+"<br><br>"); 
      } 

Les deux produisent encore les doublons


je pourrais utiliser Trim Mais est-il un produit de nettoyage/plus rapide moyen d'y parvenir.

+1

«J'ai plus de chance d'être molesté par un gorille » ironiquement que vous dites que la publicité directement à côté de ce poste pour moi implique les chimpanzés, ils sont pour vous! –

+0

HA! Probablement Microsoft Monkeys –

+0

Juste par curiosité: pourquoi/comment l'URL encodant le référent résoudrait-elle ce problème? Ou peut-être que je ne comprends pas ce qu'est l'encodage d'URL (je pense à remplacer l'espace par '% 20' et ainsi de suite ...)? – scherand

Répondre

0

[Exemple URL]

Default2.aspx? Test = test de & test2 = test2 & referrerURL = http://www.test.com/home.aspx?test=test&test=test

[Cette produirions]

test = essai
essai = test
test2 = test2
r eferrerURL = http://www.test.com/home.aspx?test=test

[donc une version modifiée de la réponse gustafc ...]

//Capture the raw url 
    test = Request.RawUrl.ToString(); 
    //Set the start index as 1 after the query ? 
    int startTxt = (test.IndexOf("?") + 1); 
    //Find the number of characters between ? and &referrerURL 
    int countTxt = ((test.IndexOf("&referrerURL")-1) - test.IndexOf("?")); 
    //Capture the substring and split into a string array using & 
    string[] aTest = test.Substring(startTxt, countTxt).Split(new Char[] { '&' }); 

[Exécution d'un test produit les éléments suivants]

-0 ~ test = test de

-1 ~ test2 = test2

[Ce qui est ce que je pensais recevoir]

(pour être complet Heres simple pour la déclaration)

for (int i = 0; i < aTest.Length; i++) 
    { 
     Response.Write("<br>-" + i + "~" + Convert.ToString(aTest[i]) + "<br>"); 
    } 
2

Je suppose que vous n'avez aucun contrôle sur la redirection, non? Été moi-même, je suis désolé de le dire. Votre problème est théoriquement insoluble, mais la tendance semble être que les personnes charmantes qui ne codent pas les paramètres URI les ajoutent à l'URL, donc vous pouvez obtenir la chaîne de requête brute (à partir de la propriété request.RawUrL) et ignorer tout ce qui suit referrerUrl. Il est laid bout à bout, mais au fond:

if(Request.QueryString["referrerUrl"] != null) 
{ 
    string qs = request.RawUrl.Substring(request.RawUrl.IndexOf("?") + 1); 
    qs = qs.Substring(0, qs.IndexOf("referrerUrl")); 
    ReplaceQuerystring(qs); 
} 

ReplaceQuerystring reçoit maintenant la chaîne de requête comme "var1 = Vala & var2 = varB &". Il suffit de le couper sur les esperluettes, de hacher chaque partie sur les signes égaux, de décoder l'URL et de stocker quelque part (en fait, request.QueryString devrait être modifiable, donc c'est probablement une option). Au moins, c'est à peu près la façon dont je l'ai fait.A cause de toi, j'espère que quelqu'un arrive avec une meilleure solution :)

+0

Merci, et oui votre droit je ne peux pas le changer; et même s'ils acceptent de le changer, le cycle de diffusion serait très loin. –

3

Quelque chose comme cela devrait fonctionner:

NameValueCollection fixedQueryString = new NameValueCollection(); 
foreach (string key in Request.QueryString.Keys) 
{ 
    string value = Request.QueryString[key]; 
    if(value.Contains(",")) 
    { 
    value = value.Split(',')[0]; 
    } 
    fixedQueryString.Add(key, value); 
} 

Ce code va créer un nouveau NameValueCollection où nous reconstruisons la chaîne de requête. Nous vérifions ensuite chaque valeur pour a, ce qui indique généralement qu'une valeur est répétée plus d'une fois. Par exemple, l'url home.aspx? Test = test & test2 = test2 & referrerurl = home.aspx? Test = test & test2 = test2 génère la valeur "test, test" pour la valeur de chaîne de requête "test".

+0

Belle solution mais un mais le code sera dans une bibliothèque de classe donc je n'aurai pas accès à la chaîne de requête au-delà de la passer comme une chaîne à la classe. –

+0

Vous pouvez créer une NameValueCollection à partir de la chaîne de requête elle-même à l'aide de la méthode HttpUtility.ParseQueryString. Ensuite, vous pourriez être en mesure d'utiliser cette méthode –

0

L'exemple suivant lit tous les paramètres de chaîne de requête "email" et ne prend que la première occurrence en lisant la chaîne "email" et en ajoutant le contenu à une nouvelle chaîne nommée "email1" jusqu'à ce qu'une virgule soit trouvée. Assez simple et facile pour les novices à utiliser.

string email = Request.QueryString["email"]; 
string email1 = ""; 
for(int i = 0; i < email.Length; i++) 
{ 
    if (email[i] != ',') 
    { 
     email1 += email[i].ToString(); 
    } 
    else 
    { 
     break; 
    } 
} 
email = email1;