Asp.net mvc 在Http处理程序ashx中获取会话

Asp.net mvc 在Http处理程序ashx中获取会话,asp.net-mvc,httphandler,Asp.net Mvc,Httphandler,我使用Http处理程序ashx文件来显示图像。 我使用Session对象获取图像并在响应中返回 现在的问题是我需要使用自定义会话对象,它只是HttpSession状态上的包装器,但当我试图获取现有的自定义会话对象时,它正在创建新的。。。 它没有显示会话数据,我检查了会话Id,它也不同 请说明如何在ashx文件中获取现有会话 注意:当我使用ASP.NET会话时,它工作正常 [WebService(Namespace = "http://tempuri.org/")] [WebServic

我使用Http处理程序ashx文件来显示图像。 我使用Session对象获取图像并在响应中返回

现在的问题是我需要使用自定义会话对象,它只是HttpSession状态上的包装器,但当我试图获取现有的自定义会话对象时,它正在创建新的。。。 它没有显示会话数据,我检查了会话Id,它也不同 请说明如何在ashx文件中获取现有会话

注意:当我使用ASP.NET会话时,它工作正常

 [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class GetImage : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
    {

您可以只使用Actionresult而不是处理程序

return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg");

返回(新文件结果(路径图像,“图像/jpeg”)

这将使事情变得更容易,因为您将使用控件/操作作为url


然后,您可以让您的操作处理任何事情,比如以字节的形式从数据库中提取数据
流式传输、检查验证等

它是ashx这一事实应该无关紧要——假设请求是从现有会话的请求派生出来的;我想应该是这样的,但是检查请求是如何形成的可能是值得的。回归基础总是值得的:)

假设没问题,我就是这样做的:

string sessionId = string.Empty; 
System.Web.SessionState.SessionIDManager sessionIDManager = new System.Web.SessionState.SessionIDManager();
bool supportSessionIDReissue;
sessionIDManager.InitializeRequest(httpContext, false, out supportSessionIDReissue); sessionId = sessionIDManager.GetSessionID(httpContext);
if (sessionId == null)
{
 // Create / issue new session id: 
 sessionId = sessionIDManager.CreateSessionID(httpContext);
}

在此结束时,sessionId变量将(应该)包含现有会话ID,或者一个新创建的会话状态,您可以稍后再使用。

当您想从ASHX或HttpHandler访问会话状态时,如果您需要读/写访问,您需要实现IReadonlSessionState或IRequireSessionState。

您是否用IRequireSessionState标记处理程序?谢谢您的回复,是的,我复制了主要问题中的代码。。请注意,我相信这只适用于ASP.NET MVC。OP与自定义HttpHandler有关。没有控制器也没有动作…问题是asp.net mvc问题!!!他还说他正试图从winforms中获得一个映像提交,他可能使用了一个httpHandler来实现,但是MVC是一个设计模式,为什么要打破这个模式呢?这个模式可以很好地工作,而不必使用任何httpHandler,因为它被控制器/操作所取代,你最好留下一个解决方案!!!!你的解决办法行得通。。但是图像的路径是什么呢?我无法在服务器端存储映像。。同样,与http处理程序相比,控制器执行此操作将花费更多的时间
string sessionId = string.Empty; 
System.Web.SessionState.SessionIDManager sessionIDManager = new System.Web.SessionState.SessionIDManager();
bool supportSessionIDReissue;
sessionIDManager.InitializeRequest(httpContext, false, out supportSessionIDReissue); sessionId = sessionIDManager.GetSessionID(httpContext);
if (sessionId == null)
{
 // Create / issue new session id: 
 sessionId = sessionIDManager.CreateSessionID(httpContext);
}