Pregunta

Me pregunto si alguien me puede ayudar - He sido la programación VB.Net durante mucho tiempo, pero rara vez he tenido que hacer mucho roscado en ASP.Net

.

Estoy intentando tomar "imágenes" de sitios web utilizando un navegador en memoria. Estas imágenes son registradas en una base de datos y se escriben en el sistema de archivos local.

Cuando corro en mi servidor local, todo funciona bien. Cuando lo ejecuto en un entorno de alojamiento compartido, todo bien hasta que hago un Thread.Join momento en el que sea el subproceso de destino termina inmediatamente o se atasca (registro de ninguna otra información se recibe de cualquiera de rosca). Me he adjuntado el registro a continuación

El código fundamental también está conectado, pero en resumen que hace:

Para cada URL, iniciar un nuevo hilo y Thread.Join a ella. El nuevo hilo se carga el navegador y comenzar la navegación. será entonces Noop hasta que la carga navegador ha completado antes de devolver la imagen de mapa de bits generado (paso siguiente).

Una vez finalizada la carga del navegador, una activa el evento. El controlador de captura la imagen de mapa de bits del navegador y lo escribe en un local.

He hecho algunas google y no puede encontrar una gran cantidad de información relacionada - He encontrado problemas comunes compartidos de alojamiento y he asegurado Tengo ellas cubierto (por ejemplo, permitiendo que las personas que llaman confianza parcial, la firma de ensamblados, etc .. .)

Te agradecería que si alguien con conocimientos sobre este tema sería tan amable de apuntar en la dirección correcta.

Muchas gracias

Nota: Soy consciente de que en la actualidad que va a ser muy lento, ya que es el procesamiento de imágenes de forma secuencial - Pero hasta que pueda conseguir que funcione en un hilo, que no tienen ninguna posibilidad de conseguir que funcione en varios subprocesos

Esto se ha mezclado en gran medida en conjunto de ejemplos de código y ni siquiera han comenzado a poner en orden hacia arriba / organizarlo mejor, así se disculpa por el código ligeramente desordenado.

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

y las entradas del registro que ver:

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
¿Fue útil?

Solución

Cuando se está ejecutando en el servidor local, Qué quiere decir el servidor web personal ASP.NET o una instalación local de IIS? El primero no es ni siquiera comparable a IIS, ya que se ejecuta como una aplicación interactiva de Windows mientras que con este último se le ejecuta como un servicio que no puede tener la interfaz de usuario y el comportamiento de las discusiones se rige estrictamente por IIS.

Usted podría intentar establecer AspCompat = "true" en la directiva Page, pero lo más probable es que no, la empresa de alojamiento ha configurado IIS ping proceso de trabajo que terminará hilos que no responden por un período de tiempo definido.

El resultado final es que el control WebBrowser (y el control ActiveX SHDocVw que envuelve) no está diseñado para trabajar en un proceso de servicio no interactivo y es muy probable en un camino cuesta arriba tratando de hacer que funcione. Por desgracia, no conozco ningún alternativas más seguras sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top