2

私はuploadifyを使用してファイルをアップロードしていますが、ファイルは自動的にハンドラーに投稿されます。次に、Webサイトの共通クラスの静的プロパティとして設定したハンドラーのセッションを変更します。次に、aspxページで同じセッションにアクセスしようとしましたが、値はnullです。これはCookieが原因であると感じていますが、URLでセッションIDを公開せずにこれを回避する方法が必要です。

ASHX:

public class Upload : IHttpHandler, IReadOnlySessionState, IRequiresSessionState 
{

    public void ProcessRequest(HttpContext context)
    {
        ...
        CMSSession.Current.UploadedFiles.Add(fileName);
    }
}

セッションクラス:

public class CMSSession
{    
    public static CMSSession Current
    {
        get
        {
            CMSSession session = (CMSSession)HttpContext.Current.Session["__CMSSession__"];
            if (session == null)
            {
                session = new CMSSession();
                HttpContext.Current.Session["__CMSSession__"] = session;
            }
            return session;
        }
    }

    public List<string> UploadedFiles { get; set; }
}

ASPX:

if (CMSSession.Current.UploadedFiles != null)
{
    ...
}
else
{
    IT'S ALWAYS NULL
}

Web.Config:

<sessionState mode="InProc" cookieless="false" /> - causes session to always null in aspx when modified in ashx
<sessionState mode="InProc" cookieless="true" /> - session value is not null, but sessionid is exposed in the url

cookielessをtrueに変更せずに、ASHXファイル内の現在のセッションにアクセスして変更し、ASPXページからセッションにアクセスするにはどうすればよいですか?

HttpContextを使用して、ASHXに渡されたコンテキストを使用してみました...何も機能しません。

この質問と同じですが、より安全な方法が必要です。ashxでセッションを設定し、aspxでそのセッションを取得します。

何か案は?

4

2 に答える 2

5

私は答えを見つけました:ハンドラーがFLASHから呼び出されているとき(swfuploadやuploadifyなど)、現在のセッションIDをハンドラーに渡しません。次に、ハンドラーは新しいセッションを作成します。これを修正するには、次の手順を実行します。

UI:JavaScript:

$(Selector).uploadify({
    swf: 'uploadify.swf',
    uploader: 'Upload.ashx?ASPSESSID=<%=Session.SessionID%>'   
});

追加先:Global.asax:

void Application_BeginRequest(object sender, EventArgs e)
{
    try
    {
        string session_param_name = "ASPSESSID";
        string session_cookie_name = "ASP.NET_SESSIONID";
        string session_value = Request.Form[session_param_name] ?? Request.QueryString[session_param_name];
        if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
    }
    catch (Exception) { }
}

void UpdateCookie(string cookie_name, string cookie_value)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);
    if (cookie == null)
    {
        HttpCookie cookie1 = new HttpCookie(cookie_name, cookie_value);
        Response.Cookies.Add(cookie1);
    }
    else
    {
        cookie.Value = cookie_value;
        HttpContext.Current.Request.Cookies.Set(cookie);
    }
}

アップロード用に取得および簡略化: http://snipplr.com/view/15180/

formsauthenticationを使用する場合は、authidを使用する必要がある場合があります。

&AUTHID=<%= Request.Cookies[FormsAuthentication.FormsCookieName] == null ? "" : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>

これをjQueryのアップローダーパラメーターに追加します。

次に、グローバルに以下を追加します。

try
    {
        string auth_param_name = "AUTHID";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;
        string auth_value = Request.Form[auth_param_name] ?? Request.QueryString[auth_param_name];

        if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
    }
    catch (Exception) { }

IE、Chrome、FFなどのハンドラーから(上記の質問で使用した静的セッションオブジェクトを使用しても)同じセッションにアクセスできるようになりました。

于 2013-01-22T19:05:30.907 に答える
0

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]

于 2013-01-22T19:28:16.023 に答える