سؤال

أتساءل عما إذا كان بإمكان شخص ما مساعدتي - لقد تم برمجة 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 الذي يلفه) غير مصمم للعمل في عملية خدمة غير تفاعلية ومن المحتمل أن تكون في تسلق شاق يحاول نجاحها. لسوء الحظ ، لا أعرف أي بدائل أكثر أمانًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top