Какой самый быстрый способ дедупликации строки запроса в C # (ASP.net) - PullRequest
2 голосов
/ 03 февраля 2009

У меня есть проблема, из-за которой компания использует систему отслеживания бизнеса, которая фиксирует первое посещение пользователей и перенаправляет их на страницу, которую они пытались посетить, но с прикрепленным URL реферера ... Теперь, когда URL-адрес реферера содержит URL-адрес, который человек пытался посетить (не спрашивайте почему, я не знаю), это заставляет меня иметь дубликат каждого значения.

Итак, посетив это ...

Home.aspx? Тест = тест & test2 = test2

становится

Home.aspx? Тест = тест & test2 = test2 & referrerurl = Home.aspx? Тест = тест & test2 = test2

Теперь, URL кодирование реферера решит проблему, но у меня больше шансов быть приставанным гориллой; так что вопрос стоит. Как я могу дедуплировать вывод из .QueryString?

В настоящее время я использую это ...

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

}

(игнорируйте try / catch, у нас есть перехват ошибок на уровне приложения, но я все еще играю с ним).

Я использую C # .net 2

Спасибо


[Дополнительная информация]

reffererURL всегда будет в конце строки, поэтому после этой точки можно будет удалить всю строку запроса?

Я пытался использовать

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

и ...

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

Оба все еще производят дубликаты


Я мог бы использовать Трим Но есть ли более чистый / быстрый способ достижения этого.

Ответы [ 4 ]

3 голосов
/ 03 февраля 2009

Примерно так должно работать:

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

Этот код создаст новую коллекцию NameValueCollection, в которой мы перестроим строку запроса. Затем мы проверяем каждое значение для a, которое обычно указывает, что значение повторяется более одного раза. Например, URL home.aspx? Test = test & test2 = test2 & referrerurl = home.aspx? Test = test & test2 = test2 сгенерирует значение «test, test» для значения строки запроса «test».

2 голосов
/ 03 февраля 2009

Полагаю, у вас нет контроля над перенаправлением, верно? Я был там сам, мне жаль говорить. Ваша проблема теоретически неразрешима, но, похоже, существует тенденция к тому, что милые люди, которые не кодируют параметры URI, просто добавляют их в URL, так что вы можете получить необработанную строку запроса (из свойства request.RawUrL) и просто игнорировать все после referrerUrl. Это неприятно, но в основном:

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

ReplaceQuerystring теперь получает строку запроса как "var1 = valA & var2 = varB &". Просто разбейте его на амперсанды, разбейте каждую часть на знаки равенства, декодируйте URL и сохраните где-нибудь (на самом деле, request.QueryString должен быть изменяемым, так что это, вероятно, вариант). По крайней мере, так я и сделал. Ради вас, я надеюсь, что кто-то придумает лучшее решение:)

0 голосов
/ 30 марта 2015

В следующем примере считываются все параметры строки запроса «email» и выполняется только первое вхождение, считывается строка «email» и добавляется содержимое в новую строку с именем «email1», пока не будет найдена запятая. Довольно просто и легко для новичков в использовании.

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;
0 голосов
/ 03 февраля 2009

[Пример URL]

Default2.aspx? Тест = тест & test2 = test2 & referrerURL = http://www.test.com/home.aspx?test=test&test=test

[Это будет производить]

тест = тест
тест = тест
test2 = test2
referrerURL = http://www.test.com/home.aspx?test=test

[Итак, отредактированная версия ответа 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[] { '&' });

[Выполнение теста дает следующее]

-0 ~ тест = тест

* 1 028 * -1 ~ test2 = test2

[Что я и ожидал получить]

(для полноты вот простое утверждение)

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