0

次の疑問があります。ページ「MyPage」があり、ページ クラスでいくつかの辞書オブジェクトを宣言しました。

私の疑問は

  1. 辞書をプライベートな非静的オブジェクトとして宣言すると、そのページ クラスの関数全体で使用できなくなります (オブジェクトは null になります)。
  2. しかし、辞書を静的であると宣言すると、関数全体でオブジェクトを横断できます。しかし、そのオブジェクトは、現在ページを開いたすべてのユーザーで同じでしょうか (各ユーザーはページのインスタンスを持ち、ページ クラスのインスタンスを持ち、クラスの静的変数はすべてのインスタンスで不変であると推測します)。クラスの)

私の理解は正しいですか?ページ クラス内のすべての関数で使用可能であり、ページの各インスタンス (ユーザー) に対して一意であるようにオブジェクトを宣言する方法。

アップデート1

Okie、ページ クラスのディクショナリ オブジェクトの初期化が別のスレッド (WCF Duplex コールバック) で行われていることがわかりました。しかし、メイン ページ スレッドでは、ディクショナリ オブジェクトはまだ null (初期化されていない) のままです。何か案は?

Update2

マーシャリング - ひょっとして役に立つ?

Update3

ジョンへの返信で-

お返事をありがとうございます。私が今直面している問題は、クライアント側の WCF コールバック クラス (別のスレッドで呼び出される) から asp.net ページにデータを渡すことです。では、どうすればそれを行うことができますか? ビュー ステートは、リクエスト間でデータを保持するのに役立つ場合があります。しかし、変更を通知するサーバーによってコールバックが呼び出された場合、どのように変更 (データ) を UI スレッド (asp.net ページ) に渡す必要がありますか?

4

4 に答える 4

1

このようなことはしないでください。

ページ間でデータを維持する必要がある場合は、セッション状態を使用してください。それが目的です。リクエストごとにページクラスの新しいインスタンスを取得することを覚えておく必要があります。スタティックを使用して、後続のリクエストのためにデータを変更し続けることはしないでください。おそらく、同時にデータを更新する複数のリクエストで問題が発生するでしょう。


ASP.NETではこのようなことはできません!

これをデスクトッププログラムのように扱っているようです。次にページでメソッドを実行したときに、クラスインスタンスとすべての状態が引き続き存在するように見えます。それは真実ではありません-リクエストが完了すると、ページは破棄されます。ページに関する情報は引き続き有効です。

特に、リクエストが終了する前にコールバックが発生しない場合、コールバックメソッドは、ページなど、リクエストに関係するものを参照しない方がよいでしょう。これは、リクエストがすでに終了した後にコールバックが発生する可能性があるためです。状態が破損しているか、さらに悪い状態です。

ページにコールバックを待たせる場合を除いて、ページでそれらを使用しない方がよいでしょう。代わりに、別のWindowsサービスなどを作成して、要求を発行し、コールバックを待機させます。次に、ページはAjaxなどを使用して、リクエストが完了したかどうかを確認し、完了したら応答を取得できます。


私がASP.NETページにコールバックするように言うのを聞いたと思うなら、あなたは誤解しています。

Windowsサービスを作成します。Windowsサービスは、ASP.NETアプリケーションが通信するWCFサービスをホストします。WCFサービスは、誰がチャットに参加したか、誰が入力したかなどを追跡します。

何か面白いことが起こったときにWebアプリケーションに通知することはできません。代わりに、WebアプリケーションはWCFサービスをポーリングして、何か面白いことが起こったかどうかを尋ねる必要があります。何かが発生すると、WCFサービスは「何か」をASP.NETアプリケーションに戻します(または、場合によっては、AJAXによって呼び出されたページに戻します)。

私は以前にミスポークしました。この状況では、コールバックコントラクトをまったく使用できません。Webページがユーザーごとに1つずつ、通知を待っているデスクトップアプリケーションのようなものではありません。これらはデスクトップアプリケーションのようなもので、ユーザーがリクエストを行うと、応答が到着する前に、PCを持って、同じように新しいPCを提供します。

于 2010-07-03T05:45:31.087 に答える
1

この質問を読み直すと、3 つの別個のステート マシンがあり、それらのいずれも結合されていないため、問題が発生します :)

  • 「ユーザー状態」の状態 - これらはディクショナリ内のキーと値のペアであり、その有効期間は複数のページ要求とコールバックにまたがります

  • 「ユーザー状態」からのデータを消費する必要がある「ページ」の状態。ページは、ページ要求ごとに破棄されます。

  • 「ユーザー状態」にデータを入力する必要がある「サービス コール」の状態 サービス コールは通常、呼び出しごとに破棄されます。

システムを結合できるいくつかの戦略があります。

  • 「ユーザー状態」のステート マシンがページの状態の一部として送信され、ポストバックで送り返されるような ViewState。これにより、サービス コールバックの実行方法が制限される場合があります

  • 「ユーザー状態」のステート マシンがサーバー側に保存され、キーでアクセスできるセッション。

  • ユーザー状態の静的辞書。外側の辞書のキーは「ユーザー状態」の ID であり、最初のページ要求で「ユーザー状態」エントリが作成され、ティアダウンを管理する必要があります。(v.セッションに似ていますが、ASP.NET がなくても機能します)。

各ソリューションには多くのニュアンスがあります-軽く読むことをお勧めします:)

于 2010-07-02T15:24:16.657 に答える
1

あなたは2番目のケースで正しいです。最初のケースでは、ユーザーがページ上の複数のコントロールをクリックすると、イベント ハンドラーは (前のイベント ハンドラーからの結果ではなく) 辞書が null であることを認識していると推測しています。

ページに対するすべてのリクエスト (同じユーザーからのものであっても) は、ページ クラスの新しいインスタンスを作成することに注意してください。つまり、リクエストが開始されるたびに、辞書null になります。後続のリクエスト間で変数の値を維持する唯一の方法は、変数をサーバー側で (たとえば、サーバー上のユーザー固有のセッション情報で) 永続化するか、ページ コンテンツと共にクライアントにプッシュして、後続のリクエスト データの一部 (したがって、リクエスト間のクライアントのブラウザで ViewState またはその他のストレージに保存されます)。

于 2010-07-02T14:55:16.010 に答える
0

静的メンバーがページのすべてのインスタンス、つまりすべての個々のユーザーで同じになることは正しいです。クラス内のすべてのメソッドからアクセスする場合は、非静的メンバーにする必要があります。オブジェクトが null である理由を調べる必要があります。適切なタイミングで適切にインスタンス化していますか?

于 2010-07-02T14:28:17.760 に答える