Передайте набор данных в общий обработчик (ashx)
Как я могу передать набор данных универсальному обработчику? Я не хочу использовать сессию или viewstate для этого.
Я пытаюсь вернуть файл Excel, преобразованный из входного набора данных, в качестве ответа.
Я уже показываю содержимое набора данных в виде отчета в одной сетке, отфильтрованной по некоторым критериям, установленным пользователем. Поскольку запрос дорогой, я не хочу выполнять то же самое в обработчике.
Было бы еще лучше, если бы я мог передать набор данных по ссылке на обработчик?
2 ответа
Я не мог найти способ передать набор данных в 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();
}
Вы не можете передать его, вам нужно кэшировать результат
По какой причине вы не хотите использовать сессию?