проверка переменной сеанса (нулевой или нет) вызывает исключение в классе обработчика - PullRequest
1 голос
/ 08 октября 2011

У меня есть ситуация, подобная описанной в этой теме:
Как я могу получить значение переменной сеанса внутри статического метода в c #?

Однако здесь нет статических методов (только класс, унаследованный от IHttpHandler)

Вот мой код:

<%@ WebHandler Language="C#" Class="Telerik.Web.Examples.FileExplorer.FilterAndDownloadFiles.Handler" %>

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Text;
using Telerik.Web.UI;

namespace Telerik.Web.Examples.FileExplorer.FilterAndDownloadFiles
{
    [RadCompressionSettings(HttpCompression = CompressionType.None)] // Disable RadCompression for this page ;
    public class Handler : IHttpHandler
    {
        #region IHttpHandler Members

        private HttpContext _context;
        private HttpContext Context
        {
            get
            {
                return _context;
            }
            set
            {
                _context = value;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            Context = context;
            string filePath = context.Request.QueryString["path"];
            filePath = context.Server.MapPath(filePath);

            if (filePath == null)
            {
                return;
            }

            System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath);
            System.IO.BinaryReader br = new System.IO.BinaryReader(streamReader.BaseStream);

            byte[] bytes = new byte[streamReader.BaseStream.Length];

            br.Read(bytes, 0, (int)streamReader.BaseStream.Length);

            if (bytes == null)
            {
                return;
            }

            streamReader.Close();
            br.Close();
            string fileName = System.IO.Path.GetFileName(filePath);
            string MimeType = GetMimeType(fileName);
            string extension = System.IO.Path.GetExtension(filePath);
            char[] extension_ar = extension.ToCharArray();
            string extension_Without_dot = string.Empty;
            for (int i = 1; i < extension_ar.Length; i++)
            {
                extension_Without_dot += extension_ar[i];
            }

            //if (extension == ".jpg")
            //{ // Handle *.jpg and
            //    WriteFile(bytes, fileName, "image/jpeg jpeg jpg jpe", context.Response);
            //}
            //else if (extension == ".gif")
            //{// Handle *.gif
            //    WriteFile(bytes, fileName, "image/gif gif", context.Response);
            //}
        if (HttpContext.Current.Session["User_ID"] != null)
        {
            WriteFile(bytes, fileName, MimeType + " " + extension_Without_dot,      context.Response);
        }

        }

        /// <summary>
        /// Sends a byte array to the client
        /// </summary>
        /// <param name="content">binary file content</param>
        /// <param name="fileName">the filename to be sent to the client</param>
        /// <param name="contentType">the file content type</param>
        private void WriteFile(byte[] content, string fileName, string contentType, HttpResponse response)
        {
            response.Buffer = true;
            response.Clear();
            response.ContentType = contentType;

            response.AddHeader("content-disposition", "attachment; filename=" + fileName);

            response.BinaryWrite(content);
            response.Flush();
            response.End();
        }

        private string GetMimeType(string fileName)
        {
            string mimeType = "application/unknown";
            string ext = System.IO.Path.GetExtension(fileName).ToLower();
            Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
            if (regKey != null && regKey.GetValue("Content Type") != null)
                mimeType = regKey.GetValue("Content Type").ToString();
            return mimeType;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        #endregion
    }
}   

В строке if (HttpContext.Current.Session["User_ID"] != null) я получаю следующее исключение, когда переменная сеанса равна нулю:

Ошибка сервера в приложении '/'.

Ссылка на объект не установлена ​​для экземпляра объекта. Описание: Ан необработанное исключение произошло во время выполнения текущей сети запрос. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации о ошибка и откуда она возникла в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект отсутствует установить экземпляр объекта

Как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 08 октября 2011

Поскольку универсальные обработчики предназначены для использования в качестве базовых процессоров запросов, по умолчанию они не поддерживают Session.Что вам нужно сделать, это украсить ваш класс обработчика с помощью интерфейса IRequiresSessionState:

public class Handler : IHttpHandler, IRequiresSessionState

Это заставит среду выполнения ASP.NET инициализировать контейнер сеанса для запроса.Затем вы можете использовать экземпляр Session из вашего HttpContext.

1 голос
/ 08 октября 2011
...