VB.net Получить доступ к пути ... отказано при запуске в потоке (только в производстве) - PullRequest
2 голосов
/ 08 марта 2012

У меня есть приложение веб-формы, которое выполняет преобразование 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

...