2010-12-27 4 views
5

uploadifyを使用してアップロードされたファイルを私のサイトにアップロードしました。ashxページを使用してファイルをデータベースにアップロードしました。IEではうまく動作しますが、Mozillaではcontext.Sessionはnull私はまた、セッションを読むためにIReadOnlySessionStateを使用しました。Uploadify ashxファイルContext.Sessionはnullを取得します

IEのようにMozillaでセッションを取得するにはどうすればいいですか?ここ

は、私は常に値を持っていますが、Mozillaで、それはそれはサーバによって設定することができない何かである可能性が高いのですか、常にnullを

+0

おそらく愚かな質問ですが、MozillaでCookieを有効にしていますか? –

+0

はい..クッキーが有効になっています – deepu

+0

@deepu、コードの関連部分(クライアントとサーバー)を表示できますか? –

答えて

11

ポストパラメータをアップロードし、OnBeginRequestのglobal.asaxのサーバー側にASP.NET_SessionId Cookieを復元するには、sessionIdを追加する必要があります。実際にはbug with flash and cookiesです。

私は仕事のフラッシュとasp.netセッションを取得するには、セッションと認証クッキーを復元するためのモジュールを作成しているので、私はそれはあなたのために有用であろうと思う:

public class SwfUploadSupportModule : IHttpModule 
{ 
    public void Dispose() 
    { 
     // clean-up code here. 
    } 

    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(OnBeginRequest); 
    } 

    private void OnBeginRequest(object sender, EventArgs e) 
    { 
     var httpApplication = (HttpApplication)sender; 

     /* we guess at this point session is not already retrieved by application so we recreate cookie with the session id... */ 
     try 
     { 
      string session_param_name = "ASPSESSID"; 
      string session_cookie_name = "ASP.NET_SessionId"; 
      if (httpApplication.Request.Form[session_param_name] != null) 
      { 
       UpdateCookie(httpApplication, session_cookie_name, httpApplication.Request.Form[session_param_name]); 
      } 
      else if (httpApplication.Request.QueryString[session_param_name] != null) 
      { 
       UpdateCookie(httpApplication, session_cookie_name, httpApplication.Request.QueryString[session_param_name]); 
      } 
     } 
     catch 
     { 
     } 

     try 
     { 
      string auth_param_name = "AUTHID"; 
      string auth_cookie_name = FormsAuthentication.FormsCookieName; 

      if (httpApplication.Request.Form[auth_param_name] != null) 
      { 
       UpdateCookie(httpApplication, auth_cookie_name, httpApplication.Request.Form[auth_param_name]); 
      } 
      else if (httpApplication.Request.QueryString[auth_param_name] != null) 
      { 
       UpdateCookie(httpApplication, auth_cookie_name, httpApplication.Request.QueryString[auth_param_name]); 
      } 
     } 
     catch 
     { 
     }    
    } 

    private void UpdateCookie(HttpApplication application, string cookie_name, string cookie_value) 
    { 
     var httpApplication = (HttpApplication)application; 

     HttpCookie cookie = httpApplication.Request.Cookies.Get(cookie_name); 
     if (null == cookie) 
     { 
      cookie = new HttpCookie(cookie_name); 
     } 
     cookie.Value = cookie_value; 
     httpApplication.Request.Cookies.Set(cookie); 
    } 
} 

また、あなたがでモジュール上に登録し必要以上にweb.configファイル:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="SwfUploadSupportModule" type="namespace.SwfUploadSupportModule, application name" /> 
    </modules> 
</system.webServer> 
+0

この方法についてもっと詳しく説明できますか? – deepu

+0

これはhttpModuleで、各開始要求で 'ASPSESSID'パラメータがチェックされ、パラメータがCookieを再作成するよりも見つかった場合にチェックされます。それで全部です。 –

+0

okz ...ありがとうございました – deepu

0

あるIE Context.Session["User"]

public class Upload : IHttpHandler, IReadOnlySessionState 
{  
    HttpContext context; 
    public void ProcessRequest(HttpContext context) 
    { 
     string UserID = context.Request["UserID"]; 

     context.Response.ContentType = "text/plain"; 
     context.Response.Expires = -1; 
     XmlDocument xDoc = new XmlDocument(); 
     HttpPostedFile postedFile = context.Request.Files["Filedata"]; 
     try 
     { 
      if (context.Session["User"] == null || context.Session["User"].ToString() == "") 
      { 
       context.Response.Write("SessionExpired"); 
       context.Response.StatusCode = 200; 
      } 
      else 
      { 
        // does the uploading to database 
      } 
     } 
    } 
} 

を行っているASHXコードですクライアントに返送されます。

下位レベルに戻る - FiddlerまたはWiresharkなどのネットワーク診断ツールを使用して、サーバーとの間で送受信されるトラフィックを調べ、IEとFirefoxの違いを比較します。

クッキーとフォームの値が期待どおりにサーバーに返送されていることを確認してください。

0

私がセッションをチェックする機能を作成しているの有効期限が切れた後、uploadifyとでASHXファイルのスクリプト・データのパラメータとして、私はパラメータがセッションが存在するかどうかを確認するためにことを確認することを通過してきました。セッションが戻ると期限切れになった場合、アップロードは行われません。それは私のために働いた。それを使用して問題が見つかりませんでした。 HttpHandlerへの接続が別のContext.Session
を(:FileInputクラスはUpload.ashxにContext.Session.SessionId異なるされた場合でContext.Session.SessionIdをデバッグしてみてください)持っているので...それは

1

Context.Session is null私の問題を解決することを望みます!

私は回避策を提案する:番目のセッションに必要な要素への参照を渡す(私のサンプルでは、​​私はセッションID変数を使用して、元のSessionIdを渡す)

.... 
var sessionId = "<%=Context.Session.SessionID%>"; 
var theString = "other param,if needed"; 
$(document).ready(function() { 
    $('#fileInput').uploadify({ 
     'uploader': '<%=ResolveUrl("~/uploadify/uploadify.swf")%>', 
     'script': '<%=ResolveUrl("~/Upload.ashx")%>', 
     'scriptData': { 'sessionId': sessionId, 'foo': theString }, 
     'cancelImg': '<%=ResolveUrl("~/uploadify/cancel.png")%>', 
.... 

と.ashxでこのアイテムを使用ファイル。

public void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
     HttpPostedFile file = context.Request.Files["Filedata"]; 
     string sessionId = context.Request["sessionId"].ToString(); 
     .... 

あなたは複雑な要素を共有する必要がある場合は、元のセッションIDを使用して、Context.Applicationの代わりContext.Sessionを使用します。Context.Application["SharedElement"+SessionID]

0

私は.ashxファイルと同様の問題がありました。ソリューションは、ハンドラがIReadOnlySessionState(読み取り専用アクセス用)またはIRequiresSessionState(読み取り/書き込みアクセス用)を実装する必要があるということでした。例:

public class SwfUploadSupportModule : IHttpHandler, IRequiresSessionState { ... } 

これらのインターフェイスは、追加のコードは必要ありませんが、フレームワークのマーカーとして機能します。

これが役立つことを願っています。

ジョナサン

関連する問題