在C#(ASP.net)中,最快的方法是什么来去重查询字符串?

3
我有一个问题,公司使用业务跟踪系统捕获用户的第一次访问并将其重定向到他们尝试访问的页面,但会附带一个引荐URL。由于引荐URL携带了用户尝试访问的URL(不要问我为什么,我也不知道),这导致我每个值都有一个副本。
因此,访问以下内容...
home.aspx?test=test&test2=test2
就变成了
home.aspx?test=test&test2=test2&referrerurl=home.aspx?test=test&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>");
            }

两者仍会产生重复项


我可以使用Trim,但是否有更干净/更快的方法来实现此目标。


1
讽刺的是,当你说这句话时,我被广告牵扯进来的内容是关于黑猩猩的,它们可能会找上你! - Chris Marisic
哈!可能是微软的猴子们。 - Chris McKee
只是出于好奇:为什么/如何对引荐者进行URL编码可以解决这个问题?或者我可能不理解什么是URL编码(我认为是将空格替换为“%20”等等...)? - scherand
URL编码的Referer将像普通值一样传递;由于它不是.NET,因此.NET将其视为2倍的URL参数。 最终,我挥舞着双手把这个蠢货请出后,我们终于成功将其删除。 - Chris McKee
4个回答

4

可以尝试以下方法:

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,我们将重建查询字符串。然后检查每个值是否包含逗号“,”,通常表示该值重复多次。例如,url home.aspx?test=test&test2=test2&referrerurl=home.aspx?test=test&test2=test2 将为查询字符串值“test”生成值“test, test”。


不错的解决方案,但是代码将在类库中,所以我无法访问查询字符串,只能将其作为字符串传递给类。 - Chris McKee
你可以使用HttpUtility.ParseQueryString方法从查询字符串本身创建一个NameValueCollection。然后你可能能够使用这个方法。 - Rune Grimstad

2

我猜你没有重定向的控制权,是吗?我自己也遇到过这种情况,很抱歉。理论上你的问题是无法解决的,但趋势似乎是那些不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应该是可变的,因此那可能是一个选项)。至少,这基本上是我所做的方式。但愿有人能提出更好的解决方案 :)


谢谢,是的,你说得对,我不能改变它;即使他们同意更改,发布周期也太远了。 - Chris McKee

0
以下示例读取所有的“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

[示例网址]

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

[这将产生]

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~test=test

-1~test2=test2

[这正是我期望收到的结果]

(为了完整起见,这里是简单的for语句)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接