Передайте набор данных в общий обработчик (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();
}

Вы не можете передать его, вам нужно кэшировать результат

По какой причине вы не хотите использовать сессию?

Другие вопросы по тегам