Попытка сохранить это вкратце: наши отгрузочные сотрудники используют сканер штрих-кода с поддержкой Windows Mobile для сканирования серийных номеров товаров, поставляемых по заказам клиентов. Эти данные отправляются через веб-службу asmx, и на сетевой принтер автоматически распечатывается отчет с информацией о клиенте и деталями отправленных товаров. Все это происходит в среде интрасети.
До недавнего времени я использовал механизм отчетов Microsoft, встроенный в Visual Studio (файлы .rdlc), для генерации отчетов и кода здесь для печати без вмешательства пользователя. Так работало несколько лет.
Недавно я столкнулся с некоторыми ограничениями форматирования отчетов в MS Reports и вместо этого внедрил отчеты в Crystal Reports (10.5.3700). Код работает нормально, но после запуска в производственном режиме от нескольких часов до суток рабочий процесс asp.net зависает (не уверен, что это подходящий термин). Процесс генерации / печати отчета выполняется вечно без исключения. Утилизация AppPool заставляет все работать некоторое время снова.
В отчетах используется режим «push», когда отчет получает типизированный набор данных, а не получает доступ к самой базе данных. Чтобы исключить метод CR ReportDocument.PrintToPrinter () из уравнения, я подумал об экспорте сгенерированных отчетов в формат PDF или аналогичный и последующей независимой печати полученного файла. Но я еще не нашел отличный способ сделать это.
Исследуя проблему, я прочитал все возможные жалобы на ошибку Crystal, но я надеюсь, что в моем коде есть ошибка, связанная с очисткой после печати отчета.
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportAppServer
Imports CrystalDecisions.Shared
Public Class CrystalReport
Private _report As ReportDocument
Public Sub New(ByVal Path As String)
_report = New ReportDocument()
_report.Load(Path)
End Sub
Public Sub SetDatasource(ByVal DataSet As DataSet)
_report.SetDataSource(DataSet)
End Sub
Public Sub AddParameter(ByVal Name As String, ByVal Value As Object)
Dim crParameterFieldDefinitions As ParameterFieldDefinitions = _report.DataDefinition.ParameterFields
Dim crParameter1 As ParameterFieldDefinition = crParameterFieldDefinitions.Item(Name)
Dim parameterValue As CrystalDecisions.Shared.ParameterDiscreteValue = New CrystalDecisions.Shared.ParameterDiscreteValue()
parameterValue.Value = Value
crParameter1.CurrentValues.Add(parameterValue)
crParameter1.ApplyCurrentValues(crParameter1.CurrentValues)
End Sub
Public Sub Print(ByVal PrinterPath As String)
_report.PrintOptions.PrinterName = PrinterPath
_report.PrintToPrinter(1, True, 0, 0)
Close()
End Sub
Private Sub Close()
_report.Close()
_report.Dispose()
_report = Nothing
End Sub
End Class
Есть идеи для дальнейшей отладки? Мне никогда не приходилось прибегать к реальной отладке Windows (WinDbg, Process Explorer и т. Д.), Поэтому любая рекомендация относительно того, какой инструмент отладки попробовать в первую очередь, была бы полезной.
Спасибо.