2012-11-06 49 views
1

如何将数据集传递到通用处理程序? 我不想使用会话或视图状态来做到这一点。将数据集传递给通用处理程序(ashx)

我想返回一个从输入数据集转换为excel文件作为响应。

我已经将数据集内容显示为一个网格中的报告,并按用户设置的某些条件过滤。由于查询很昂贵,我不想在处理程序中执行相同的操作。

它甚至会更好,如果我可以参照处理程序传递数据集?

+0

转换数据集继承到XML模式,并通过邮寄发送到通用hendelar可能是它的工作原理 –

+0

正如我在回答评论到ArseMkrt,数据集是大尺寸的,所以将其转换为xml模式,检索它并处理excel转换都需要很多时间..这就是为什么我想将它作为参考传递的原因。 –

回答

0

我找不到任何方式将数据集传递给ashx,除了创建处理类的对象并分配给它。然后我调用该对象的ProcessRequest方法。它运行良好,构建成功。但是当我尝试发布网站时,代码错误地发现无法找到类名。代码就像下面给出的一样。

//this is working fine in VS (build succeeded and ProcessRequest returned the file!) 
//but didn't compile only on publishing 
MyHandler handlerObj = new myHandler(); 
handlerObj.DataSource = myDataset; 
handlerobj.ProcessRequest(Context); 

我解决了这个问题,用通用的处理程序替换了一个普通的c#类,它有一个接受上下文和数据集的方法。然后我在类中调用了方法,在那里我将文件流写入Context.Response中,它工作得很好。这个类就是这样做一样的处理程序,并无需从IHttpContext

public void ProcessDownload(HttpContext context, DataSet DataSource) 
{ 
    context.Response.Clear(); 
    context.Response.ContentType = "application/vnd.ms-excel"; 
    MemoryStream file = getExcelMemStream(DataSource); 
    context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "myFile.xls")); 
    context.Response.BinaryWrite(file.GetBuffer()); 
    context.Response.End(); 
} 
+0

有谁知道我为什么只在发布时出错? –

0

你无法通过它,你需要缓存的结果

你不想使用会话的原因吗?

+0

我希望数据集只传递一次,数据集的大小也会变大。所以我觉得将它添加到会话或HttpContext项目是不是一个好主意,因为它可能会保持,直到会话结束。 –

+0

你知道,我想大发回的数据集将其转换到Excel并寄回将需要更长的时间,而不是用相同的条件下运行服务器端的查询,或到高速缓存,并重新发送...如果你不这样做想在会话缓存,因为内存的使用,你可以转储到文件,并在同一个屏幕上的下一个请求删除文件...... –

+0

我可以把从已绑定GridView的数据源的数据集。因此,将相同的对象传递到同一个Web应用程序中的某个地方可能不需要太多时间,对吧? –

相关问题