Thread.oin في بيئة استضافة مشتركة
-
21-09-2019 - |
سؤال
أتساءل عما إذا كان بإمكان شخص ما مساعدتي - لقد تم برمجة VB.NET لفترة طويلة ولكن نادراً ما كان عليّ القيام بالكثير من الخيوط في ASP.NET.
أحاول أخذ "لقطات شاشة" من مواقع الويب باستخدام متصفح في الذاكرة. ثم يتم تسجيل هذه الصور في ديسيبل ومكتوبة إلى نظام الملفات المحلي.
عندما أقوم بتشغيله على الخادم المحلي ، يعمل كل شيء بشكل جيد. عندما أقوم بتشغيله في بيئة استضافة مشتركة ، كل شيء على ما يرام حتى أقوم بتقديم موضوع. قم بالضغط عند هذه النقطة إما أن ينتهي مؤشر ترابط الهدف على الفور أو يتعثر (لا يتم استلام أي معلومات تسجيل أخرى من أي من الموضوعات). لقد أرفقت السجل أدناه
يتم إرفاق الرمز الحاسم أيضًا ولكنه باختصار:
لكل عنوان URL ، ابدأ موضوعًا جديدًا وخيطًا. سيقوم الخيط الجديد بتحميل المتصفح ويبدأ التنقل. سيتم بعد ذلك noop حتى يتم إكمال تحميل المتصفح قبل إرجاع صورة Bitmap التي تم إنشاؤها (الخطوة التالية).
على إكمال تحميل المتصفح ، يطلق الحدث. يلتقط المعالج صورة صورة نقطية من المتصفح ويكتبها إلى محلي.
لقد قمت ببعض googling ولا يمكنني العثور على الكثير من المعلومات ذات الصلة - لقد وجدت مشاكل استضافة مشتركة مشتركة وتأكدت من تغطيةها (على سبيل المثال السماح للمتصلين الموثوق بهم جزئيًا ، تجميعات التوقيع ، إلخ ...)
أود أن أقدر ذلك إذا كان أي شخص لديه معرفة حول هذا الموضوع سيكون لطيفًا بما يكفي لتوجيه لي في الاتجاه الصحيح.
شكرا جزيلا
NB: أنا أدرك أنه في الوقت الحالي سيكون بطيئًا للغاية لأنه يقوم بمعالجة الصور بشكل متتابع - ولكن حتى أتمكن من العمل في مؤشر ترابط واحد ، ليس لدي أي فرصة للعمل على مؤشرات ترابط متعددة.
يتم تشويه هذا إلى حد كبير من عينات رمز ولم أبدأ حتى في ترتيبها / تنظيمها بشكل أفضل ، لذا أعتذر عن الكود الفوضوي قليلاً.
Public Function GetWebsiteImage(ByVal URL As String, Optional ByVal BrowserWidth As Integer = 1280, Optional ByVal BrowserHeight As Integer = 1024) As Bitmap
LogIt(String.Format("Webshot {1}: {0}", "Getting Image", id))
_URL = URL
_BrowserHeight = BrowserHeight
_BrowserWidth = BrowserWidth
Dim T As Thread
T = New Thread(New ThreadStart(AddressOf GenerateImage))
T.SetApartmentState(ApartmentState.STA)
'T.IsBackground = True
LogIt(String.Format("Webshot {1}: {0}", "Starting Thread", id))
T.Start()
'*** THIS IS THE LAST LOG ENTRY I SEE ***
LogIt(String.Format("Webshot {1}: {0}", "Joining Thread", id))
T.Join()
Return _Bitmap
End Function
Friend Sub GenerateImage()
LogIt(String.Format("Webshot {1}: {0}", "Instantiating Web Browser", id))
Dim _WebBrowser As New WebBrowser()
_WebBrowser.ScrollBarsEnabled = False
LogIt(String.Format("Webshot {1}: {0}", "Navigating", id))
_WebBrowser.Navigate(_URL)
AddHandler _WebBrowser.DocumentCompleted, AddressOf WebBrowser_DocumentCompleted
'AddHandler _WebBrowser.
While _WebBrowser.ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
LogIt(String.Format("Webshot {1}: {0}", "Disposing", id))
_WebBrowser.Dispose()
End Sub
Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
LogIt(String.Format("Webshot {1}: {0}", "Document load complete", id))
Dim _WebBrowser As WebBrowser = DirectCast(sender, WebBrowser)
_WebBrowser.ClientSize = New Size(Me._BrowserWidth, Me._BrowserHeight)
_WebBrowser.ScrollBarsEnabled = False
_Bitmap = New Bitmap(_WebBrowser.Bounds.Width, _WebBrowser.Bounds.Height)
_WebBrowser.BringToFront()
_WebBrowser.DrawToBitmap(_Bitmap, _WebBrowser.Bounds)
_PageTitle = _WebBrowser.DocumentTitle
LogIt(String.Format("Webshot {1}: {0}", "About to capture bitmap", id))
_Bitmap = DirectCast(_Bitmap.GetThumbnailImage(_BrowserWidth, _BrowserHeight, Nothing, IntPtr.Zero), Bitmap)
LogIt(String.Format("Webshot {1}: {0}", "Bitmap captured", id))
End Sub
وإدخالات السجل التي أراها:
2010 01 19 02:21:01 > Starting Process
2010 01 19 02:21:01 > Capture 229 Processing: http://www.obfuscated.com/
2010 01 19 02:21:01 > Capture 229 Found capture db record
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Instantiated
2010 01 19 02:21:01 > Capture 229 Requesting image
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Getting Image
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Starting Thread
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Joining Thread
المحلول
عندما تقوم بتشغيله على الخادم المحلي الخاص بك ، هل تعني خادم الويب الشخصي ASP.NET أو تثبيت محلي لـ IIS؟ السابق لا يشبه حتى IIS لأنه يعمل كتطبيق Windows التفاعلي ، بينما مع هذا الأخير ، ستشغل كخدمة لا يمكن أن تحتوي على واجهة مستخدم ويخضع سلوك المواضيع بشكل صارم.
يمكنك محاولة إعداد ASPCompat = "True" في توجيه الصفحة ، ولكن على الأرجح ، قامت شركة الاستضافة بتكوين عملية Pinging لعامل IIS والتي ستنهي مؤشرات الترابط التي لا تستجيب لفترة زمنية محددة.
خلاصة القول هي أن التحكم في WebBrowser (والتحكم في SHDOCVW ActiveX الذي يلفه) غير مصمم للعمل في عملية خدمة غير تفاعلية ومن المحتمل أن تكون في تسلق شاق يحاول نجاحها. لسوء الحظ ، لا أعرف أي بدائل أكثر أمانًا.