Я работал над своим первым использованием потоков в приложении ASP.Net и столкнулся с проблемой.
Код работает нормально, когда я запускаю его локально, но как только я загрузил его на наш dev-сервер, он не запускается, но также не выдает ошибку.
Я провел некоторое исследование и обнаружил, что мне нужно, чтобы поток олицетворял WindowsIdentity, что я и сделал, но поток все еще не работает, я также попытался увеличить максимальное количество потоков в IIS и все еще ничего.
Я предполагаю, что проблема связана с IIS, так как это единственное, что отличается между моей локальной машиной и сервером, но у меня нет опыта в IIS, и я полностью застрял на этом, поэтому любая помощь будет оценена.
Я использую IIS 7.5 в Windows 2008 R2.
Метод, выполняемый в новом потоке, находится в классе в папке App_Code и выглядит следующим образом:
Public Class RosterEmailer
Inherits System.Web.UI.Page
Dim thisID As String
Dim thisName As String
Dim strDutyStartDate As date
Dim thisWorkEmail As String
Dim thisHomeEmail As String
Dim mailbody As string
Dim Sec As Object
Public sub Ini(ByVal _thisID As String,
ByVal _thisName As String,
ByVal _strDutyStartDate As date,
ByVal _thisWorkEmail As String,
ByVal _thisHomeEmail As String,
ByVal _mailbody As string,
ByVal _security As Object)
thisID = _thisID
thisName = _thisName
strDutyStartDate = _strDutyStartDate
thisWorkEmail = _thisWorkEmail
thisHomeEmail = _thisHomeEmail
mailbody = _mailbody
Sec = _security
End Sub
Public Sub SendMail()
Dim id as System.Security.Principal.WindowsIdentity = CType(Sec,System.Security.Principal.WindowsIdentity)
id.Impersonate()
'Dim response As System.Web.HttpResponse = System.Web.HttpContext.Current.Response
'Declare the SMTP server we are going to use
Dim smtp As New SmtpClient("192.168.20.11")
Dim cred As NetworkCredential = New NetworkCredential("domain\\username","mypassword")
smtp.DeliveryMethod = SmtpDeliveryMethod.Network
smtp.Credentials = cred
Dim mail As New MailMessage()
' create email
mail.From = New MailAddress("rostering@ourdomain.com")
mail.To.Add(thisWorkEmail)
mail.CC.Add(thisHomeEmail)
mail.Subject = thisName + " Roster from our company for " + strDutyStartDate.Month.ToString() + "_" + strDutyStartDate.Year.ToString()
mail.IsBodyHtml = True
mail.Priority = MailPriority.High
mail.Body = mailbody
Dim strURL As String = "http://blueprintdev/Opsproject/Ops/rosteroutput.aspx?InstructorID=" & thisID.ToString() & "&Instructor=" & thisName.ToString() & "&Start=" & strDutyStartDate
Dim holder As String = String.Empty
Dim uu As New Uri(strURL,UriKind.Absolute)
Dim rq As HttpWebRequest = WebRequest.Create(uu)
Dim res As HttpWebResponse = rq.GetResponse()
Dim stream1 As Stream = res.GetResponseStream()
Using r1 As StreamReader = New StreamReader(stream1,Encoding.UTF8)
holder = r1.ReadToEnd()
End Using
Dim pdfConverter As PdfConverter = New PdfConverter
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4
pdfConverter.PdfDocumentOptions.PdfPageOrientation = PDFPageOrientation.Landscape
pdfConverter.PdfDocumentOptions.PdfCompressionLevel = PdfCompressionLevel.Normal
pdfConverter.PdfDocumentOptions.ShowHeader = True
pdfConverter.PdfDocumentOptions.ShowFooter = True
pdfConverter.PdfDocumentOptions.LeftMargin = 5
pdfConverter.PdfDocumentOptions.RightMargin = 5
pdfConverter.PdfDocumentOptions.TopMargin = 5
pdfConverter.PdfDocumentOptions.BottomMargin = 5
pdfConverter.PdfDocumentOptions.GenerateSelectablePdf = True
pdfConverter.PdfDocumentOptions.ShowHeader = False
pdfConverter.PdfFooterOptions.FooterText = ("Printed on " & Now())
pdfConverter.PdfFooterOptions.FooterTextColor = Color.DarkBlue
pdfConverter.PdfFooterOptions.FooterTextFontSize = "10"
pdfConverter.PdfFooterOptions.FooterTextFontType = PdfFontType.Helvetica
pdfConverter.PdfFooterOptions.DrawFooterLine = True
pdfConverter.PdfFooterOptions.PageNumberText = "Page"
pdfConverter.PdfFooterOptions.PageNumberTextFontType = PdfFontType.Helvetica
pdfConverter.PdfFooterOptions.PageNumberTextFontSize = "10"
pdfConverter.PdfFooterOptions.ShowPageNumber = True
pdfConverter.LicenseKey = "theKeyGoesHere"
Dim downloadBytes() As Byte = pdfConverter.GetPdfBytesFromHtmlString("<font face='verdana' size='1'>" & holder)
Dim stream As Stream = New MemoryStream(downloadBytes)
Dim filename As String = thisName + "_Roster_" + strDutyStartDate.Month.ToString() + "_" + strDutyStartDate.Year.ToString() + ".pdf"
' add pdf to email
Dim att As Attachment = New Attachment(stream, filename, MediaTypeNames.Application.Pdf.ToString())
mail.Attachments.Add(att)
' send email
smtp.Send(mail)
End Sub
End Class
Затем я вызываю это из метода в моем коде, например:
Dim sec As System.Security.Principal.WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
Dim emailer As RosterEmailer = New RosterEmailer()
emailer.Ini(thisID,thisName,strDutyStartDate,thisWorkEmail,thisHomeEmail,body,sec)
Dim Thr As System.Threading.Thread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf emailer.SendMail))
Thr.Start()