Nano Hash - криптовалюты, майнинг, программирование

Потоки не запускаются в ASP.Net на сервере, но отлично работают локально

Я работал над своим первым использованием потоковой передачи в приложении ASP.Net и столкнулся с проблемой.

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

Я провел некоторое исследование и обнаружил, что поток должен олицетворять 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("[email protected]")
               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()

  • Веб-приложение ASP.NET — неподходящее место для знакомства с многопоточностью, не в последнюю очередь потому, что вам никогда, никогда не на самом деле нужно делать это, а в противном случае, но не ограничиваясь этим, это ' неправильная среда. См. также здесь 15.03.2012
  • Я использую многопоточность здесь, потому что мне нужно отправить около 150 электронных писем, у каждого из них есть PDF-файл, который генерируется и добавляется, а затем электронное письмо отправляется, без потоков это занимает около 5 минут и время ожидания браузера, с потоками это занимает около 28 секунд 15.03.2012
  • Это просто предлог для того, чтобы не разбивать проект на правильные части. Используйте многопоточность, только не здесь. 15.03.2012
  • Как бы вы предложили мне это сделать, если здесь не следует использовать потоки? 15.03.2012
  • Вы читали ссылку, которую я дал? 15.03.2012
  • Приветствую, не увидел редактирование. сейчас буду читать 15.03.2012

Ответы:


1

Я в целом согласен с рекомендациями здесь. В частности, я бы создал очередь этих электронных писем (и составляющих их компонентов), которые должны быть отправлены на стороне веб-приложения. Это позволяет выполнять быструю запись в БД и выполнять ее.

Вторая часть — использовать механизм для проверки очереди (таблицы в вышеупомянутой БД) и обработки исходящих писем. Простые варианты включают в себя консольное приложение без окон, которое выполняет это при выполнении по расписанию задач в Windows, службу Windows, которая просыпается каждые несколько минут, чтобы проверить очередь, и так далее, и многое другое.

Поскольку служба Windows кажется немного тяжелой для того, что вы делаете, и из-за скорости создания прототипа для консольного приложения, я бы порекомендовал вам выбрать направление консольного приложения. Это также позволяет очень легко тестировать время выполнения и производительность в средах разработки, тестирования и производства с меньшими затратами на планирование миграции среды.

04.04.2012

2

Проблема заключается в WindowsIndentity, которую вы передаете в функцию потока. В ASP.NET в веб-приложении контекст безопасности освобождается после завершения потока запроса. На практике это означает, что WindowsIdentity, переданный в фоновом/долго работающем потоке, становится неработоспособным (например, доступ к свойству Name вызовет ошибку).

Если поток отправителя электронной почты требует, чтобы он выполнялся в области безопасности запрашивающего пользователя (для делегирования и т. д.), вы должны поместить свой код в службу, опубликованную с помощью WCF. Узел WCF IIS относится к контексту безопасности разветвленных потоков. (По моему опыту, это также относится к серверу Visual Studio Web Dev)

С другой стороны, если вы просто используете свойства WindowsIndentity, просто соберите их в потоке запроса и вместо этого передайте эту коллекцию в фоновый поток.

15.03.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..