Frage

Ich frage mich, wenn jemand mir helfen kann - ich habe für eine lange Zeit VB.Net worden Programmierung haben aber selten viel Einfädeln in ASP.Net zu tun hatte,

.

Ich versuche, „Screenshots“ von Websites zu nehmen einen speicherinternen Browser. Diese Bilder werden dann in einem DB protokollieren und in dem lokalen Dateisystem geschrieben.

Wenn ich es auf meinem lokalen Server laufen, es funktioniert gut. Wenn ich es in einem Shared-Hosting-Umgebung ausgeführt werden, es ist alles in Ordnung, bis ich an welcher Stelle ein Thread.Join tun entweder die Ziel-Thread beendet sofort oder stecken bleibt (keine weitere Protokollierung Informationen von beiden Thread empfangen wird). Ich habe das Protokoll unter

angebracht

Der entscheidende Code angebracht ist auch, aber kurz gesagt es tut:

Für jede URL, einen neuen Thread und Thread.Join starten. Der neue Thread wird den Browser laden und Navigation beginnen. es wird dann noop bis der Browser Last vor der Rückkehr der Bitmap-Bild erzeugt (nächster Schritt) abgeschlossen hat.

Im Browser Last Abschluss, wird ein Ereignis ausgelöst wird. Die Handler erfasst das Bitmap-Bild aus dem Browser und schreibt sie in einem lokalen.

Ich habe einige googeln getan und nicht viele verwandte Informationen finden - ich habe festgestellt, gemeinsame gemeinsame Probleme Hosting und haben dafür gesorgt, muss ich sie abgedeckt (zB Möglichkeit für den Anrufer teilweise vertraut, die Unterzeichnung Baugruppen, etc .. ).

Ich würde es begrüßen, wenn jemand mit dem Wissen zu diesem Thema so gut sein würde, mich in der richtigen Richtung zu zeigen.

Vielen Dank

. NB: Ich bin mir bewusst, dass es wird sehr langsam sein derzeit, wie es Bilder der Reihe nach der Verarbeitung ist - aber, bis ich es an der Arbeit auf einem Thread zu bekommen, ich habe keine Chance, es immer auf mehreren Threads arbeiten

Dies ist vor allem verstümmelt zusammen aus Codebeispielen und ich habe es nicht einmal ordentlich begonnen up / organisiert es besser so Entschuldigung für den etwas chaotisch Code.

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

und die Protokolleinträge sehe ich:

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
War es hilfreich?

Lösung

Wenn Sie es auf Ihrem lokalen Server ausgeführt wird, meinen Sie den ASP.NET persönlichen Web-Server oder eine lokale Installation von IIS? Ersteres ist auf IIS nicht einmal vergleichbar, da es als eine interaktive Windows-Anwendung ausgeführt wird, während bei letzterem werden Sie als Dienst ausgeführt werden, die keine Benutzeroberfläche und das Verhalten von Threads können streng von IIS geregelt ist.

Sie könnten versuchen, AspCompat = „true“ auf der Seite Richtlinie Einstellung, aber wahrscheinlicher als nicht, hat das Hosting-Unternehmen IIS-Arbeitsprozess Pingen konfiguriert, welche Threads beendet wird, die für eine bestimmte Zeit nicht reagieren.

Das Endergebnis ist, dass das WebBrowser-Steuerelement (und das SHDocVw ActiveX-Steuerelement, dass es Wraps) nicht in einem nicht-interaktiven Service-Prozess zur Arbeit entworfen und Sie sind wahrscheinlich in einem anstrengenden Aufstieg versucht, es funktioniert. Leider weiß ich nicht von irgendwelchen sichereren Alternativen jedoch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top