Передать набор данных универсальному обработчику (ashx)

Как я могу передать набор данных универсальному обработчику? Я не хочу использовать сеанс или состояние просмотра для этого.

Я пытаюсь вернуть файл excel, преобразованный из входного набора данных, в качестве ответа.

Я уже показываю содержимое набора данных в виде отчета в одной сетке, отфильтрованного по некоторым критериям, заданным пользователем. Поскольку запрос дорогой, я не хочу выполнять то же самое и в обработчике.

Было бы еще лучше, если бы я мог передать набор данных по ссылке в обработчик?


person Sen Jacob    schedule 06.11.2012    source источник
comment
преобразовать набор данных в схему xml и отправить его в общий хенделар по почте, возможно, это сработает   -  person Anant Dabhi    schedule 06.11.2012
comment
как я прокомментировал в ответ на ArseMkrt, набор данных имеет большой размер, поэтому преобразование его в схему xml, его извлечение и обработка преобразования excel занимают много времени... поэтому мне нравится передавать его в качестве ссылки.   -  person Sen Jacob    schedule 06.11.2012


Ответы (2)


Пройти нельзя, нужно кешировать результат

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

person Arsen Mkrtchyan    schedule 06.11.2012
comment
Я хочу, чтобы набор данных передавался только один раз, и набор данных был бы большого размера. Поэтому я считаю, что добавление его в сеанс или элементы HttpContext не является хорошей идеей, поскольку оно может сохранить это до окончания сеанса. - person Sen Jacob; 06.11.2012
comment
Вы знаете, я думаю, что отправка большого набора данных обратно, преобразование его в excel и отправка обратно займет больше времени, чем выполнение запроса на стороне сервера с теми же условиями или кеширование и повторная отправка... если вы не хотите для кэширования в сеансе из-за использования памяти, вы можете сбросить его в файл и удалить файл при следующем запросе того же экрана... - person Arsen Mkrtchyan; 06.11.2012
comment
Я мог бы взять набор данных из уже связанного источника данных gridview. Так что может не потребоваться много времени, чтобы передать один и тот же объект куда-то в том же веб-приложении, верно? - person Sen Jacob; 06.11.2012
comment
Можно ли установить набор данных для любого внутреннего свойства обработчика? Я имею в виду что-то вроде создания объекта-обработчика, назначения набора данных и его вызова..? - person Sen Jacob; 06.11.2012
comment
да, вы можете, но вам нужно сохранить его до следующего запроса пользователя, верно? ASP.Net не сохраняет никакого состояния, поэтому оно будет потеряно. а с другой стороны, если вы даже присваиваете какое-то свойство и хотите сохранить его в памяти, это то же самое, что держать его в сессии, потому что опять же вы не будете знать, будет оно вызываться или нет, и когда удалять ... - person Arsen Mkrtchyan; 06.11.2012
comment
Я не хочу сохранять это... как только пользователь щелкнет ссылку для загрузки, я беру текущий источник данных gridview и отправляю набор данных обработчику для преобразования его в Excel. Могу ли я наследовать IDisposible для объекта обработчика и освободить память после завершения запроса? Если я могу передать набор данных таким образом, не могли бы вы предложить какой-либо пример ссылки с соответствующим фрагментом кода? - person Sen Jacob; 06.11.2012
comment
еще один вопрос, где у вас текущий gridview? Вы хотите снова сделать запрос на получение сетки данных и передать ее обработчику? - person Arsen Mkrtchyan; 06.11.2012
comment
gridview находится на странице моего веб-приложения, на той же странице есть кнопка загрузки, при нажатии кнопки загрузки я беру источник данных gridview для преобразования. поэтому я не думаю, что будет выполняться еще один запрос. Привязка к сетке происходит только тогда, когда пользователь фильтрует данные для отображения в представлении сетки. - person Sen Jacob; 06.11.2012
comment
Я считаю, что вы можете создать свойство в своем классе дескриптора, и для преобразования дескриптора вам нужно указать конкретный тип и назначить источник данных свойства, который у вас есть. - person Arsen Mkrtchyan; 06.11.2012

Я не мог найти никакого способа передать набор данных в 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);

Я решил проблему, заменив универсальный обработчик обычным классом С#, у которого есть метод, принимающий контекст и набор данных. Затем я вызвал метод в классе, где я записал свой файловый поток в 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();
}
person Sen Jacob    schedule 09.11.2012