Как выполнить фон / время операций ввода-вывода через брандмауэр в ASP.NET C # - PullRequest
1 голос
/ 31 октября 2010

Резюме У нас есть приложение ASP.NET, которое позволяет пользователям запрашивать базу данных SQL Server через средний уровень (довольно стандартный материал).Когда пользователь пытается создать PDF для строк, которые были ему возвращены.Каждый набор строк с общим идентификатором «превратится» в отдельную страницу в результирующем PDF.

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

Мое текущее решение заключается в следующем:

  1. Если количество возвращаемых строк превышает настроенное значение threshold, пользователь получает сообщение, в котором спрашивается, хотят ли они создать PDF-файлы в фоновом режиме и получать уведомления отпо электронной почте с URL-адресом, когда они сделаны, чтобы они могли загрузить их.

  2. Если это приемлемо для пользователя, я создаю два DataTable s: один с фактическими данными, а другой с MetaDataнапример, где сохранить полученный PDF, имя и другую информацию мета-типа.

  3. Затем я могу использовать DataTable.WriteXML для создания файла «задания» в определенной папке.

  4. Все это делается в отдельном потоке, поэтому пользователь может продолжать делать то, что он хочет.

Проблема :Я действительно хочу сохранить XML-файл задания на компьютере внутри нашего брандмауэра (общая сетевая папка), но, похоже, не могу по соображениям безопасности.Мне сказали, что я мог бы использовать Impersonation и пытался, но не смог заставить его работать.

Другая часть этого приложения - это то, что «слушает» в папке «input» и обрабатывает их«рабочие» файлы один раз в час (или аналогичное расписание), перемещает сгенерированный PDF-файл в нужное место и отправляет электронное письмо пользователю.

Я получил часть, которая читает рабочие файлы и генерирует работающий PDF-файл, ичасть, которая создает файлы заданий, работает (когда я запускаю ее внутри брандмауэра), но когда я запускаю ее вне брандмауэра, даже при попытке подделки, она не работает.(продолжает говорить «Сетевое местоположение не найдено».

Вопрос (ы): Я иду об этом правильным путем?Как мне записать эти файлы через брандмауэр?Любые дизайнерские идеи или предложения?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 31 октября 2010

Можете ли вы хотя бы сделать http через брандмауэр? Тогда не создавайте файл XML, а вызывайте веб-сервис, который находится внутри брандмауэра. В идеале этот веб-сервис также не будет создавать XML-файл, а вместо этого помещает данные в очередь сообщений. MSMQ Может быть полезно здесь. Затем генератор PDF считывает XML из этой очереди. Таким образом, вы не столкнетесь с ситуацией, когда генератор подберет файл, который еще не завершен. И вы не тратите время и ресурсы на опрос файлов.

Надеюсь, это поможет.

0 голосов
/ 09 ноября 2010

Я решил это, создав в нашей базе данных таблицу PDFJobs .

Эта таблица содержит Критерии, используемые для запуска отчета , а также желаемую папку шаблонов и файл , целевую папку и имя файла для полученного PDF.

Затем я написал инструмент командной строки ( PDFGenerator ), который читает из этой таблицы и для каждой строки создает отдельный поток, который выполняет генерацию PDF. После того, как PDF создан, он отправляет электронное письмо на адрес электронной почты (также содержится в таблице).

Затем у меня есть запланированная задача Windows, которая запускает этот инструмент PDFGenerator каждый час.
Это не идея, но она делает свою работу.

Недавнее обновление состоит в том, что им нужно что-то, что будет вызывать PDFGenerator всякий раз, когда создается строка задания ... Думаю, мне придется еще немного подумать об этом.

...