Question

Je me demande si quelqu'un peut me aider - j'ai été la programmation VB.Net depuis longtemps, mais ai rarement eu à faire beaucoup dans le filetage ASP.Net

.

Je suis tenté de prendre des captures d'écran « » de sites Web en utilisant un navigateur en mémoire. Ces images sont ensuite enregistrées dans une base de données et écrites dans le système de fichiers local.

Quand je cours sur mon serveur local, tout cela fonctionne très bien. Quand je lance dans un environnement d'hébergement partagé, il est tout beau jusqu'à ce que je fais Thread.join à quel point soit le fil cible se termine immédiatement ou est bloqué (aucune autre information est reçue de vous connecter soit fil). Je joins le journal ci-dessous

Le code essentiel est également attaché mais en bref, il fait:

Pour chaque URL, lancer un nouveau thread et Thread.join à lui. Le nouveau thread va charger le navigateur et commencer à naviguer. il sera alors NOOP jusqu'à ce que la charge du navigateur est terminée avant de retourner l'image bitmap généré (étape suivante).

A la fin de charge du navigateur, un événement se déclenche. Le gestionnaire capture l'image bitmap à partir du navigateur et l'écrit dans un local.

Je l'ai fait googling et ne peut pas trouver beaucoup d'informations connexes - J'ai trouvé des problèmes communs d'hébergement partagé et ont fait que je les ai couverts (par exemple permettant aux appelants de confiance partielle, des ensembles de signature, etc .. .)

Je vous en serais reconnaissant si quelqu'un ayant des connaissances sur ce sujet serait assez bon pour me diriger dans la bonne direction.

Merci

NB: Je suis conscient qu'à l'heure actuelle, il va être très lent car il est le traitement des images en séquence - Mais jusqu'à ce que je peux l'obtenir pour travailler sur un fil, je n'ai aucune chance de le faire marcher sur plusieurs threads

Ceci est en grande partie à partir d'échantillons mélangés, de code et je l'ai même pas commencé à ranger vers le haut / mieux l'organiser si des excuses pour le code un peu en désordre.

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

et les entrées du journal, je vois

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
Était-ce utile?

La solution

Lorsque vous exécutez sur votre serveur local, voulez-vous dire le serveur web personnel ASP.NET ou une installation locale de IIS? Le premier est même pas comparable à IIS parce qu'il fonctionne comme une application Windows interactive alors que ce dernier vous courrez comme un service qui ne peut avoir l'interface utilisateur et le comportement des threads est régie strictement par IIS.

Vous pouvez essayer de régler AspCompat = « true » sur la directive Page, mais plus que probable, la société d'hébergement a configuré le processus de travail IIS pinging qui mettra fin à des fils qui ne répondent pas pendant une période de temps définie.

La ligne de fond est que le contrôle WebBrowser (et le contrôle SHDocVw ActiveX qui l'enveloppe) ne sont pas conçus pour fonctionner dans un processus de service non interactif et vous êtes probablement dans une montée difficile d'essayer de le faire fonctionner. Malheureusement, je ne connais pas d'alternatives plus sûres cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top