Загрузить файл Ashx Context.Session становится нулевым - PullRequest
5 голосов
/ 27 декабря 2010

У меня есть загрузка файла на моем сайте, которая выполняется с помощью uploadify. Для загрузки файла в базу данных используется страница ashx. В IE это нормально работает, но в Mozilla контекст. Сеанс становится пустым. Я также использовал IReadOnlySessionStateчитать сессию.

как я могу получить сессию в Mozilla, как IE.

вот код 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 оно всегда равно нулю

Ответы [ 5 ]

11 голосов
/ 27 декабря 2010

Вам необходимо добавить sessionId, чтобы загрузить параметры сообщения и восстановить cookie ASP.NET_SessionId на стороне сервера в global.asax в OnBeginRequest.Это на самом деле ошибка со вспышкой и куки .

Я создал модуль для восстановления сеанса и аутентификации файлов cookie, чтобы получить рабочий флэш и сеанс 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>
1 голос
/ 07 октября 2011

Context.Session is null .. , поскольку подключение к HttpHandler имеет другое Context.Session
(отладьте и попробуйте: Context.Session.SessionId в том месте, где fileInput отличается от Context.Session.SessionId в Upload.ashx)!

Я предлагаю обходной путь: передать ссылку на элементы, которые вам нужны во втором сеансе (в моем примере я передаю исходный 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();
      ....

Если вам нужно совместно использовать сложные элементы, используйте Context.Application вместо Context.Session , используя оригинальный SessionID: Context.Application["SharedElement"+SessionID]

0 голосов
/ 01 апреля 2013

У меня была похожая проблема с файлом .ashx. Решение состояло в том, что обработчик должен реализовать IReadOnlySessionState (для доступа только для чтения) или IRequiresSessionState (для доступа для чтения и записи). например:

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

Этим интерфейсам не требуется никакого дополнительного кода, но они служат маркерами для платформы.

Надеюсь, что это поможет.

Jonathan

0 голосов
/ 28 декабря 2010

Я создал функцию, чтобы проверить, истек ли сеанс, а затем передать его в качестве параметра в данных сценария загрузки и в файле Ashx. Я проверяю этот параметр, чтобы увидеть, существует ли сеанс или нет.не состоится. Это сработало для меня.Не нашел никаких проблем, используя это.надеюсь, что решить мою проблему

0 голосов
/ 27 декабря 2010

Вероятно, это что-то, что не может быть установлено сервером или отправлено обратно клиенту.

Вернитесь на более низкий уровень - используйте инструмент диагностики сети, такой как Fiddler или Wireshark , чтобы проверить трафик, отправляемый на / с вашего сервера, и сравнить различиямежду IE и Firefox.

Посмотрите на заголовки, чтобы убедиться, что файлы cookie и значения форм отправляются обратно на сервер, как и ожидалось.

...