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

谢谢


[附加信息]

引用 URL 将始终位于字符串的末尾,因此可以在此之后删除所有查询字符串吗?

我试过使用

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但是有没有更清洁/更快的方法来实现这一点。

4

4 回答 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,我们将在其中重建查询字符串。然后我们检查每个值的 a ,这通常表明一个值重复了不止一次。例如,url home.aspx?test=test&test2=test2&referrerurl=home.aspx?test=test&test2=test2 将为查询字符串值“test”生成值“test, test”。

于 2009-02-03T11:26:31.490 回答
2

我假设您无法控制重定向,对吗?我自己去过那里,我很抱歉。您的问题在理论上是无法解决的,但趋势似乎是那些不使用 URI 编码参数的可爱的人只是将它们附加到 URL,因此您可以获得原始查询字符串(来自 request.RawUrL 属性)并忽略之后的所有内容推荐人网址。这很丑陋,但基本上:

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 应该是可变的,所以这可能是一个选项)。至少,这几乎是我做的方式。为了您,我希望有人提出更好的解决方案:)

于 2009-02-03T11:00:47.750 回答
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~测试=测试

-1~test2=test2

[这是我期望收到的]

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

    for (int i = 0; i < aTest.Length; i++)
    {
        Response.Write("<br>-" + i + "~" + Convert.ToString(aTest[i]) + "<br>");
    }
于 2009-02-03T12:10:14.473 回答
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;
于 2015-03-30T16:33:40.550 回答