3

同じURLを指す3つのiframeを持つ単純なhtmlページを想像してみてください。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
</body>
</html>

私の目標は、mypage.aspxコードビハインドでユニークな訪問者を追跡することです。単純に聞こえますが、次のとおりです。

if (Request.Cookies["myc"] == null)
{
    // New visitor!
    Response.Cookies["myc"].Value = myval;
    Response.Cookies["myc"].Expires = DateTime.Now.AddYears(10);
}
else
{
    // Returning visitor
}

問題があります。3つのiframeを使用してhtmlページにアクセスすると、mypage.aspxに3回同時にヒットし、Request.Cookies ["myc"]は3回すべてnullになりますが、同じユーザーであることを理解する必要があります(1回目のヒット:新規訪問者、2回目および3番目のヒット:合計1人の訪問者/ユーザーのリピーター)。これを修正する方法はありますか?

4

4 に答える 4

2

非常に興味深い質問です!

中心的な問題は、インターネットが非同期の匿名の場所であるということです。

ブラウザは、これらのリクエストの1つを一度に送信することも、3つすべてを同時に送信することもできるため、ユーザーのマシンでイベントの順序を制御する方法はありません。

さらに、ブラウザはユーザーを一意に識別するために特別な努力をしません。識別システムはすべて、要求/応答サイクルにジェリーリグする必要があります。GAはCookieを使用してユーザーにタグを付け、リクエストごとにその情報を取得できます。基本的に、GAはユーザーがサイトにアクセスする前にタグを付けるため、そのサービスは「最初の」ヒットでユーザーを識別できます。

あなたの問題は、あなた自身の識別ソリューションを実装したいということです。どういうわけか、リクエストにユーザーのIDを含める必要があります。しかし、彼らがサイトにアクセスするまで、あなたはそれを行う方法がありません。また、同時リクエストごとに異なるIDが応答に埋め込まれるため、ユーザーが単一のIDでタグ付けされることを保証することはできません。

基本的に、私の知る限り、匿名ユーザーをサイトで自動的かつ一意に識別できるようにするソリューションはありません。

IPアドレスを使用したくなるかもしれませんが、それは状況によっては機能しますが、それは非常に悪い解決策です。現在、私は雇用主のファイアウォールの背後にいます。現在表示されているIPアドレスを使用して私を識別すると、私とここで1人のユーザーとして働いている5,000人の人々が表示されます。これは非常に危険なシステムです。

本当に、ユーザーごとに1つのIDが本当に必要な場合(複数の同時リクエストなどによって回避したり、誤って踏みつけたりすることはできません)、唯一の解決策は、埋め込まれた値を介して最初のリクエストでユーザーが自分自身を明示的に識別することを要求することです。 POSTまたはGETクエリ、または前回のアクセス時に作成されたCookie。

あなたのシナリオでは、3つの応答すべてが一意のIDを持つCookieを生成する可能性があります(3つのIDが連続しており、それぞれが前の値を上書きします)。ランディングページは、一般的な「私のサイトへようこそ」ページ、またはそのようなものである可能性があります。次に、ユーザーはリンクをクリックしてサイトにアクセスできます。その時点で、最後に生成されたCookie(最後に生成されたIDを含む)がリクエストに埋め込まれます。ユーザーごとに1つのIDのみが生成されることを保証することはできませんが、リクエストの最初のラウンドの後(およびサイトのメインコンテンツ部分にアクセスする前)に、少なくとも1つのIDで識別されることをかなり確信で​​きます。

もちろん、身元不明のユーザーへの応答が基本的にコンテナー(IDなし)である複雑なAJAXソリューションを使用することもできます。次に、AJAXは、IDを取得していることを示すフラグをCookie内に設定し、最初のリクエストを送信できます。後続のAJAXコンテナは、このCookieを確認してからポーリング状態に入り、フラグがクリアされるのを待ちます。最初の応答が返されると、最初のAJAXコンテナがCookieにIDを設定し、フラグを変更する可能性があります。次に、残りのコンテナはフラグの変更を検出し、(独自のリクエストを送信するのではなく)CookieからIDを取得できます。

AJAXコンテナがIDを取得すると、一意のIDとともにコンテンツのリクエストを送信できます。その後、サイトは応答して、コンテナに適切なデータを入力します(または単に適切なページにリダイレクトします)。

このソリューションが適切に実装されていれば、ユーザーにIDが1つだけ割り当てられることが多かれ少なかれ保証されます。しかし、本当に、それは価値がありますか?Cookieとリクエストはユーザーに「属している」ことを忘れないでください。ユーザーは両方を非常に簡単に編集できます。編集されたIDを検出するための手法がありますが(ほとんどの場合、何らかの形式の暗号化が含まれます)、ユーザーが選択した場合、ユーザーが自分自身を「匿名化」するのを防ぐことはできません。中途半端な解決策で十分な場合もあります。

于 2012-10-31T20:16:11.193 に答える
1

あなたがしなければならないのは、PageLoadの代わりに[webMethod]に同じコードを入れてから、js(XMLHttpRequest)を介してクライアントから[WebMethod]を呼び出すことです。3つの呼び出しを順番に受け取ります。同時ヒットによる問題はもうありません。

于 2012-11-03T09:14:50.900 に答える
0

iframeを使用せず、マスターページを使用してください。マスターページを作成し、このコードを「mypage.aspx」の上部に配置します

<%@ Page Language="C#" MasterPageFile="~/Site1.Master" ...
于 2012-11-04T14:18:18.143 に答える
0

それは理にかなっています。これらすべてのリクエストには、最初はCookieが含まれていないため、すべての場合でnullになります。これは可能な限り非同期で行う必要があることを忘れないでください。必然的に線形です(フローがどのようになっているかについては専門家ではないかもしれません)。

代わりに、IPアドレスとタイムスタンプを確認してください。同じであれば、同じユーザーであるかのように作業できます。

はい、そのソリューションは完璧ではありませんが、Cookieソリューションよりも優れています。

于 2012-10-25T10:49:13.640 に答える