5

私のサイトにuploadifyを使用してファイルをアップロードしていますが、これはashxページを使用してファイルをデータベースにアップロードします。IEでは正常に機能しますが、Mozillaではcontext.SessionがnullになりIReadOnlySessionStateます。セッションの読み取りにも使用しました。

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

これが私が行ったashxコードです

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
            }
        }
   }
}

IEではContext.Session["User"]常に値がありますが、Mozillaでは常にnullです

4

5 に答える 5

11

onBeginRequestでglobal.asaxのサーバー側でpostparamsをuploadifyし、ASP.NET_SessionIdcookieを復元するためにsessionIdを追加する必要があります。これは実際にはフラッシュとCookieのバグです。

仕事のフラッシュとasp.netセッションを取得するために、セッションと認証Cookieの復元用のモジュールを作成したので、次の場合に役立つと思います。

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>
于 2010-12-27T11:46:04.883 に答える
1

Context.Session is null..への接続にHttpHandlerは別のContext.Session
ものがあるため (デバッグして試してください:Context.Session.SessionIdfileInputはUpload.ashxとは異なりContext.Session.SessionIdます)!

回避策を提案します:2番目のセッションで必要な要素への参照を渡します(私のサンプルでは、SessionId​​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();
      ....

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

于 2011-10-07T14:15:29.037 に答える
0

サーバーによる設定に失敗したか、クライアントに返送されなかった可能性があります。

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

ヘッダーを調べて、Cookieとフォームの値が期待どおりにサーバーに返送されていることを確認します。

于 2010-12-27T11:22:25.773 に答える
0

セッションの有効期限が切れていることを確認する関数を作成し、それをuploadifyのscript-dataとashxファイルのパラメーターとして渡します。そのパラメーターを確認して、セッションが存在するかどうかを確認します。セッションの有効期限が切れていることを返す場合、アップロードは行われません。場所。それは私のために働いた。それを使用して問題は見つかりませんでした。それが私の問題を解決することを願っています

于 2010-12-28T09:30:48.710 に答える
0

.ashxファイルでも同様の問題が発生しました。解決策は、ハンドラーがIReadOnlySessionState(読み取り専用アクセスの場合)またはIRequiresSessionState(読み取り/書き込みアクセスの場合)を実装する必要があることでした。例えば:

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

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

これがお役に立てば幸いです。

ジョナサン

于 2013-04-01T18:23:42.277 に答える