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を使用できますが、これを実現するためのよりクリーンで高速な方法はありますか。

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 プロパティから) 生のクエリ文字列を取得し、その後のすべてを無視することができます。リファラー URL。それはお尻醜いですが、基本的に:

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

【URL例】

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=テスト

-1~テスト2=テスト2

[これは私が受け取ると思っていたものです]

(完全を期すために、単純な 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 に答える