2009-08-11 14 views
3

jquery.Uploadifyを使用してアプリケーションに使用するためにファイルを投稿するASP.NET MVCビューがあり、Uploadifyで気付いた副作用の1つは、 FlashファイルUploadifyは、サーバーポストへのファイルの送信に使用します。コントローラからは、ASP.NETから独自のSessionIDが取得されます。私のアップロードコントローラがセッションを使用して、将来の私のアプリケーションによる操作のために現在のユーザによってアップロードされたファイルのリストを保存していない場合は、これは問題ありません。ビューでは、現在のユーザーのセッションには、投稿されたばかりのファイルは含まれていません。ASP.NET MVC - セッションを使用する代わりに

セッションに頼らずに、私が望むものを達成する方法についての提案はありますか?

答えて

0

これは私が思いついた解決策です。私は多くのテストを行っていませんが、現在のシナリオではSessionに代わるものとして受け入れられるようです。 Global.asaxのSession_End/Session_Startを使用して、必要に応じて行を作成して削除するようにします。

public class UserTable : Dictionary<string, Dictionary<string, object>> 
{ 
    public new object this[string key] 
    { 
     get 
     { 
      object value = null; 
      if (HttpContext.Current != null) 
      { 
       var sessionId = HttpContext.Current.Session.SessionID; 
       if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key)) 
        value = base[sessionId][key]; 
      } 
      else 
       throw new Exception("No HttpContext present."); 
      return value; 
     } 
     set 
     { 
      if (HttpContext.Current != null) 
      { 
       var sessionId = HttpContext.Current.Session.SessionID; 
       if (!ContainsKey(sessionId)) 
        Add(sessionId, new Dictionary<string, object>()); 
       if (!base[sessionId].ContainsKey(key)) 
        base[sessionId].Add(key, value); 
       else 
        base[sessionId][key] = value; 
      } 
      else 
       throw new Exception("No HttpContext present."); 
     } 
    } 

    public object this[string sessionId, string key] 
    { 
     get 
     { 
      object value = null; 
      if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key)) 
       value = base[sessionId][key]; 
      return value; 
     } 
     set 
     { 
      if (!ContainsKey(sessionId)) 
       Add(sessionId, new Dictionary<string, object>()); 
      if (!base[sessionId].ContainsKey(key)) 
       base[sessionId].Add(key, value); 
      else 
       base[sessionId][key] = value; 
     } 
    } 

    public void Add(string sessionId) 
    { 
     Add(sessionId, new Dictionary<string, object>()); 
    } 

    public void Add() 
    { 
     if (HttpContext.Current != null) 
      Add(HttpContext.Current.Session.SessionID); 
     else 
      throw new Exception("No HttpContext present."); 
    } 

    public new void Remove(string sessionId) 
    { 
     base.Remove(sessionId); 
    } 

    public void Remove() 
    { 
     if (HttpContext.Current != null) 
      Remove(HttpContext.Current.Session.SessionID); 
     else 
      throw new Exception("No HttpContext present."); 
    } 
} 
2

Uploadifyは純粋にフロントエンドスクリプトなので、なぜASP.NETからセッションを取得するのか分かりません。私はまたあなたの特定の問題が何であるか完全に理解していません。

ファイルが一旦アップロードされると、ユーザーはそれらを画面上で見ることができないという問題がある場合は、Uploadifyから独立したファイルのリストを表示する方法を考え出すことをお勧めします。可能であれば、ファイルと共にIDトークンを送信してから、データベースからリストを表示するのに必要なデータを取得するようにしてください。

+1

これは本質的に問題です。私はアップロードをデータベースにキャッシュすることを考えましたが、それはトラックで釘を打つようなものです。 –

0

多分、キーはクライアントのユーザ:ipでしょうか? この値は、異なるセッション間で保存するオブジェクトになります。

+0

実際にはそれほど悪くはありません。ありがとうございます。 –

+0

もちろん、喫茶店のユーザーのようなシナリオではあまり暑くはありませんが、アップロード操作でセッションIDを渡してからセッションIDのHashMapを使用すると、提供されたセッションID。特定のセッションIDに対してSessionオブジェクトを取得することは可能ですか? –

+0

異なるセッションIDは、新しいセッションが存在することを示します。以前のセッションを保存しない限り、古いセッションは使用できなくなります(現在のセッションには存在しません)。セッションはオブジェクトであり、あなたのハッシュにそれを格納することができますが、回避策は解決するよりも多くの問題を引き起こすと思います。 しかし、あなたは喫茶店で何を指しているのですか?ユーザーはIPアドレスを変更しますか? – Freddy

0

クロスチェックすること - アップロードする前にいくつかのデータを追加してセッションを「ライブ」にしましたか? ASP.NETは、セッションにデータがあるまでセッションを再生成します。

+0

はい、セッションは実際にはライブです。この問題は私だけでなく、SWFUploadにも関係しています。 :) –

+0

Gotcha。私はHTTPデバッガ(Fiddler2など)を使用して、ワイヤ上で何が起こっているのかを見てみましょう。何かがここでかなり合わない。少なくとも私のスパイディセンスによると。 –