ASP.NetWebサイトでYahooUIライブラリの一部であるYahooUploaderを使用して、ユーザーがファイルをアップロードできるようにしています。なじみのない人のために、アップローダーはFlashアプレットを使用して動作し、FileOpenダイアログをより細かく制御できるようにします。ファイルタイプのフィルターを指定したり、複数のファイルを選択したりすることができます。これはすばらしいことですが、次の文書化された制限があります。
既知のFlashバグのため、WindowsのFirefoxで実行されているアップローダーはアップロード時に正しいCookieを送信しません。FirefoxのCookieを送信する代わりに、それぞれのドメインに対してInternetExplorerのCookieを送信します。回避策として、Cookieを使用しないアップロード方法を使用するか、アップロード要求にdocument.cookieを追加することをお勧めします。
そのため、ユーザーがFirefoxを使用している場合、ファイルをアップロードするときにCookieを使用してセッションを維持することはできません。彼らが誰であるかを知る必要があるので、私は彼らのセッションが必要です!回避策として、次のようにApplicationオブジェクトを使用しています。
Guid UploadID = Guid.NewGuid();
Application.Add(Guid.ToString(), User);
そのため、一意のIDを作成し、それをPage.User
アプリケーションスコープにオブジェクトを格納するためのキーとして使用しています。ファイルがアップロードされるときに、そのIDを変数としてPOSTに含めます。次に、ファイルのアップロードを受け入れるハンドラーで、次のようにUserオブジェクトを取得します。
IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];
これは実際には機能しますが、2つの明らかな欠点があります。
ユーザーがアップロードページにアクセスしてから実際にファイルをアップロードするまでの間にIIS、アプリプール、またはアプリケーションだけを再起動すると、それらの「uploadid」がアプリケーションスコープから削除され、認証できないためアップロードが失敗します。 。
Webファーム(場合によってはWebガーデン)のシナリオに拡張すると、これは完全に機能しなくなります。将来このアプリをスケーリングする予定がある場合を除いて、心配する必要はありません。
誰かがより良い方法を持っていますか?POST変数で実際のASP.NetセッションIDを渡し、もう一方の端でそのIDを使用してセッションを取得する方法はありますか?
を介してセッションIDを取得できることSession.SessionID
、およびYUIを使用して次のページに投稿する方法を知っています。私が知らないのは、それを使用しSessionID
て状態サーバーからセッションを取得する方法です。
はい、セッションを保存するために状態サーバーを使用しているので、それらはアプリケーション/ IISの再起動を永続化し、Webファームシナリオで機能します。