在 Http 处理程序 ashx 中获取会话信息

4
我正在使用Http Handler ashx文件来显示图像。 我曾经使用Session对象来获取图像并在响应中返回。
现在的问题是,我需要使用自定义Session对象,它只是HttpSession State上的包装器。但是当我尝试获取现有的自定义会话对象时,它会创建新的……它不显示会话数据,我检查了会话ID,它也不同。 请建议如何在ashx文件中获取现有会话?
注意:当我使用ASP.NET Session时,它正常工作。
 [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class GetImage : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
    {

你是否在处理程序中标记了IRequiresSessionState? - Mauricio Scheffer
谢谢回复,是的,我复制了主要问题中的代码,请看一下。 - batwadi
3个回答

2

当您想从ASHX或HttpHandler访问Session State时,需要实现IReadOnlySessionState或IRequiresSessionState(如果需要读/写访问权限)。


1

它是一个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或一个新创建的会话ID,您可以稍后重用。

0

你可以使用Actionresult而不是处理程序来实现这个功能

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

或者

返回(新的FileResult(Pathtoimage,“image / jpeg”));

这样做会使事情变得更容易,因为您将使用控件/操作作为您的URL

<img src="/Images/showImage/1">

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


我相信这只适用于ASP.NET MVC。OP是关于自定义HttpHandler的。没有控制器或操作... - jrista
这是一个关于ASP.NET MVC的问题!!!他说他正在尝试获取来自WinForms的图像,他可能使用了httpHandler来实现,但MVC是一种设计模式,为什么要打破这个模式呢?该模式在不使用任何httpHandler的情况下可以正常工作,因为它被控制器/操作所替代,您最好留下一个解决方案!!! - davethecoder
你的解决方案可以工作,但图片的路径将会是什么?我不能将图片存储在服务器端。再次让控制器去做这件事会比使用HTTP处理程序花费更多时间。 - batwadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接