Domanda

Mi chiedo se qualcuno mi può aiutare - Sono stato di programmazione VB.Net per molto tempo, ma raramente ha dovuto fare molto filettatura in ASP.Net

.

Sto cercando di prendere "screenshot" di siti web utilizzando un browser in-memory. Queste immagini vengono poi registrati in un DB e scritti nel file system locale.

Quando eseguo sul mio server locale, tutto funziona bene. Quando ho eseguito in un ambiente di hosting condiviso, è tutto bene fino a quando faccio un Thread.join a quel punto sia il thread di destinazione termina immediatamente o si blocca (info nessuna ulteriore registrazione ricevuto da entrambi filo). Ho allegato il registro seguente

Il codice cruciale è anche collegato ma in breve lo fa:

Per ogni URL, avviare un nuovo thread e Thread.join ad esso. Il nuovo thread caricherà il browser e avviare la navigazione. sarà poi NOOP fino a quando il carico del browser ha completato prima di tornare l'immagine bitmap generato (passo successivo).

Al termine del carico del browser, un evento viene. Il gestore cattura l'immagine bitmap dal browser e scrive in un locale.

Ho fatto qualche googling e non riesco a trovare un sacco di informazioni correlate - ho trovato più comuni problemi di hosting condiviso e ho fatto in modo che ho ottenuto li coperto (ad esempio consentendo ai chiamanti parzialmente attendibili, firma assemblee, ecc .. .)

lo apprezzerei se qualcuno con la conoscenza su questo argomento sarebbe così gentile da puntare nella direzione giusta di me.

Grazie

NB: Sono consapevole del fatto che allo stato attuale sta per essere molto lento in quanto è l'elaborazione di immagini in sequenza - Ma fino a quando posso farlo funzionare su un filo, non ho alcuna possibilità di farlo funzionare su più thread

Questo è in gran parte alterati insieme da esempi di codice e non ho ancora cominciato a riordinare in su / organizzarlo meglio quindi mi scuso per il codice un po 'disordinato.

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

e le voci di registro che vedo:

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
È stato utile?

Soluzione

Quando si esegue sul vostro server locale, vuoi dire il server web personale ASP.NET o un'installazione locale di IIS? Il primo non è nemmeno paragonabile a IIS perché viene eseguito come un'applicazione interattiva di Windows, mentre con la seconda sarete in esecuzione come un servizio che può avere alcuna interfaccia utente e il comportamento di fili è regolato rigorosamente da IIS.

Si potrebbe provare ad impostare AspCompat = "true" sulla direttiva pagina, ma più probabile che non, la società di hosting ha configurato IIS pinging processo di lavoro che si concluderà thread che non rispondono per un periodo di tempo definito.

La linea di fondo è che il controllo del browser web (e il controllo SHDocVw ActiveX che avvolge), non è progettato per funzionare in un processo di servizio non interattivo ed è molto probabile dentro per una strada in salita cercando di farlo funzionare. Purtroppo non so di eventuali alternative più sicure però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top