У меня есть приложение веб-формы, которое выполняет преобразование xslt.
Если я вызываю метод нормально, все работает нормально, вот так:
SendReceiptEmail(infoObject) 'runs fine, no exceptions thrown
Но если я попытаюсь вызвать тот же метод в THREAD, он выдаст исключение Access is denied, но только на рабочем сервере, на моих серверах разработки и тестирования все в порядке:
Dim newThread As New Threading.Thread(SendReceiptEmail)
newThread.Start(infoObject)
Метод выглядит так:
Public Shared Function SendReceiptEmail(ByVal infoObject As MyObject ) As Boolean
Try
Dim fromAddr As String = infoObject.fromEmail
Dim toAddrAs String = infoObject.toEmail
Dim subject As String = infoObject.subject
Dim body As String = BuildCustomerReceipt(infoObject ) '!!! <== exception thown only if run in a thread in Production
Dim m As New System.Net.Mail.MailMessage(fromAddr, toAddr, subject, body)
return True
....
Catch ex As Exception
'The ex.Message caught here is "Access to the path <full paath & name of xslt> is denied - only get it when run as a thread in Production
Return False
End Try
Return True
End Function
Функция BuildCustomerReceipt, которая передает исключение, выглядит следующим образом:
Public Shared Function BuildCustomerReceipt( infoObject ) As String
Dim doc As New XmlDocument()
...build doc ...
Dim pathToXslTemplate As String = "<FUll path to xslt file>"
Dim emailBody As String = XslTransform(doc, pathToXslTemplate) ' <== exception from here!
Return emailBody
End Function
И, наконец, метод, который на самом деле вызывает исключение, выглядит так:
Public Shared Function XslTransform(ByVal doc As XmlDocument, ByVal pathToXslTemplate As String) As String
Dim objXSLTransform As XslCompiledTransform = New XslCompiledTransform()
objXSLTransform.Load(pathToXslTemplate) ' !!! <== Exception Thrown from here !!!
Dim objSWriter As New StringWriter()
objXSLTransform.Transform(doc, Nothing, objSWriter)
Return objSWriter.ToString()
End Function
Похоже, проблема с правами доступа к файлу, но я не знаю, почему это происходит или как это исправить. Одно и то же приложение запускает как многопоточные, так и не поточные версии, так почему у многопоточной версии нет доступа к родительскому приложению?
Кстати, разработка - это Windows 7, но производство - это Windows Server 2008, а IDE - Visual Studio 2008