【问题标题】:checking session variable (null or not) causes an Exception in a Handler class检查会话变量(是否为空)会导致 Handler 类中的异常
【发布时间】:2011-12-03 07:10:09
【问题描述】:

我的情况类似于此线程中描述的情况:
How can i get the value of a session variable inside a static method in 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) 的行中,当会话变量为空时,我得到以下异常:

“/”应用程序中的服务器错误。

对象引用未设置为对象的实例。说明:一个 当前 web 执行过程中发生未处理的异常 要求。请查看堆栈跟踪以获取有关 错误以及它起源于代码的位置。

异常详细信息:System.NullReferenceException:没有对象引用 设置为对象的实例

我该如何解决这个问题?

【问题讨论】:

  • 看起来您正在将上下文传递给方法。您是否尝试过使用该上下文?另外,您是否考虑过使用可为空的参数并将会话值从调用方法传递给方法?
  • 嗨,亲爱的詹姆斯/我有一些使用此处理程序的 JavaScript 代码/我想检查处理程序中的会话值/但我遇到了上层错误...
  • 查看@Matthew Abbott 的答案。那应该解决问题

标签: c# asp.net session httpcontext ihttphandler


【解决方案1】:

因为通用处理程序被设计为准系统请求处理器,所以默认情况下它们不支持 Session。你需要做的是用IRequiresSessionState 接口装饰你的处理程序类:

public class Handler : IHttpHandler, IRequiresSessionState

这会导致 ASP.NET 运行时为请求初始化会话容器。然后,您可以使用 HttpContext 中的 Session 实例。

【讨论】:

  • +1 很好很简单。该接口是否实现了 OP 需要注意的任何方法?
  • @JamesJohnson - 不,它只是一个标记接口,处理程序只需要用接口装饰,其余的由运行时处理。
  • @Matthew Abbott 感谢您的回答/但会引发另一个错误 -> 编译器错误消息:CS1722:基类 'IRequireSessionState' 必须位于任何接口之前
  • IRequiresSessionState 是一个接口,而不是一个类。你能用修改后的Handler 类声明来更新你的问题吗?
  • @Matthew Abbott 感谢您的关注/但我的整个班级都在我的 Q 中...我有一些在我的项目中使用 Handler.ashx 文件的 JavaScript 代码/在这个文件中(我将整个代码粘贴到我的 Q)我想检查我的会话变量!
【解决方案2】:

【讨论】:

  • 不要只发布链接作为回答。至少写点东西,或将链接作为评论发布。修复它,我会支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2022-09-30
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多