vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB2005, VB200801.09.08
PictureBox mit Proxy-Server Unterstützung

Mit Hilfe dieser Komponente wird die Standard PictureBox von VB.NET um die Möglichkeit erweitert, Bilder über einen Proxy-Server aus dem Web abzurufen und anzuzeigen.

Autor:  Roland WutzkeBewertung:     [ Jetzt bewerten ]Views:  1.675 
http://www.vb-power.netSystem:  WinNT, Win2k, WinXP, Win8, Win10, Win11 Beispielprojekt 

In vielen Mittelständigen- und Großunternehmen wird zur Kommunikation mit dem Web ein Proxy-Server verwendet, über den die Mitarbeiter im Internet surfen. Dabei muss sich der Mitarbeiter an den Proxy-Server durch Benutzername und Passwort authentifizieren. Die Anwendung (wie bspw. der Internet Explorer) muss dabei in der Lage sein, mit einem solchen Proxy-Server kommunizieren zu können.

Wenn Sie eine WebClient Anwendung programmiert haben, in dem das Webbrowser Steuerelement verwendet wird, ist das noch kein Problem. Das Webbrowser Steuerelement erkennt automatisch, aufgrund der Systemeinstellungen, den Proxy-Server und fordert eine Authentifizierung vom Benutzer an.

Verwenden Sie in Ihrer Anwendung eine PictureBox um z.B. Grafiken, Diagramme oder gar Werbebanner aus dem Web abzurufen, so erhalten Sie die Fehlermeldung „Proxy authentification requiered“ vom Proxy-Server zurück. Die PictureBox ist schlichtweg nicht in der Lage, die Grafiken über einen Proxy-Server abzurufen, da sie diese Möglichkeit nicht vorsieht.

Die nachfolgende Komponente „ProxyPictureBox“ schafft Abhilfe. Sie erbt von PictureBox und überschreibt die Eigenschaft „ImageLocation“, wobei weiterhin auch die ursprüngliche Verwendung, also ohne Proxy-Server, möglich ist. Das Abrufen der Daten über den Proxy-Server erfolgt dabei asynchron, so dass die Auslastung Ihrer Anwendung nicht beeinflusst wird.

Hinweis: Wenn Sie die „ProxyPictureBox“ verwenden, müssen Sie erst die Eigenschaften für den Proxy-Server vornehmen, bevor Sie die Eigenschaft „ImageLocation“ setzen.

Imports System.Net
Imports System.Text
Imports System.ComponentModel
 
''' <summary>
''' PictureBox mit Proxy Server Unterstützung 
''' </summary>
''' <remarks>
''' Die Komponente erbt von PictureBox und erweitert diese umd die Möglichkeit,
''' den Download eines Images aus dem Web über einen Proxy Server zu realisieren.
''' Der Download des Images erfolgt dabei asynchron.
''' 
''' August 2008 - vb-Power.net
''' </remarks>
Public Class ProxyPictureBox
  Inherits PictureBox
 
  Private m_UseProxy As Boolean = False
  Private m_UseProxyIESettings As Boolean = False
  Private m_ProxyServer As String
  Private m_ProxyPort As Integer = 8080
  Private m_ProxyUserName As String
  Private m_ProxyPassword As String
  Private m_ImageLocation As String
 
  Private isInitCompleted As Boolean = False
  Private InitTimer As New Windows.Forms.Timer
 
  Public Event ProxyError(ByVal sender As Object, ByVal ex As Exception)
  Public Event ProxyDownloadCompleted(ByVal sender As Object, _
    ByVal e As EventArgs)
  Public Sub New()
    AddHandler InitTimer.Tick, AddressOf InitTimerTick
    InitTimer.Interval = 250
    InitTimer.Enabled = True
  End Sub
  Private Sub InitTimerTick(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    isInitCompleted = True
    InitTimer.Enabled = False
    Me.ImageLocation = m_ImageLocation
  End Sub
  ''' <summary>
  ''' Legt den Web-Speicherort fest, aus dem das Image geladen wird.
  ''' </summary>
  ''' <remarks>
  ''' Die überladene Eigenschaft unterstützt den Download des Images über
  ''' einen Proxy Server. Legen Sie zuerst alle Proxy Eigenschaften fest,
  ''' bevor Sie dieser Eigenschaft einen Wert zuweisen. Belassen Sie die
  ''' Eigenschaft "UseProxy" auf False, so wird das Image ohne Proxy 
  ''' angezeigt. (Default)
  ''' </remarks>
  Public Overloads Property ImageLocation() As String
    Get
      Return m_ImageLocation
    End Get
    Set(ByVal value As String)
      m_ImageLocation = value
      If String.IsNullOrEmpty(m_ImageLocation) Then
        Exit Property
      Else
        If isInitCompleted Then
          If m_UseProxy Then
            Dim dWeb As New WebClient
            AddHandler dWeb.DownloadDataCompleted, AddressOf dWebDownloadDataCompleted
 
            Try
              If m_UseProxyIESettings Then
                dWeb.Proxy = Net.WebRequest.GetSystemWebProxy
              Else
                dWeb.Proxy = New WebProxy(m_ProxyServer, m_ProxyPort)
              End If
              dWeb.Proxy.Credentials = New NetworkCredential(m_ProxyUserName, _
                m_ProxyPassword)
              dWeb.Encoding = Encoding.Default
              dWeb.CachePolicy = New System.Net.Cache.RequestCachePolicy( _
                System.Net.Cache.RequestCacheLevel.NoCacheNoStore)
              dWeb.DownloadDataAsync(New Uri(m_ImageLocation))
            Catch ex As Exception
              RaiseEvent ProxyError(Me, ex)
            Finally
              dWeb.Dispose()
            End Try
          Else
            MyBase.ImageLocation = m_ImageLocation
          End If
        End If
      End If
    End Set
  End Property
  ''' <summary>
  ''' Delegated Sub, wird aufgerufen wenn der Download über den 
  ''' Proxy Server beendet wurde
  ''' </summary>
  Private Sub dWebDownloadDataCompleted(ByVal sender As Object, _
    ByVal e As System.Net.DownloadDataCompletedEventArgs)
    Try
      If Not e.Cancelled Then
        Dim MS As New IO.MemoryStream(e.Result)
        MyBase.Image = Image.FromStream(MS)
        RaiseEvent ProxyDownloadCompleted(Me, New EventArgs)
      Else
        RaiseEvent ProxyError(Me, New Exception("Download cancelled"))
      End If
    Catch ex As Exception
      RaiseEvent ProxyError(Me, ex)
    End Try
  End Sub
  ''' <summary>
  ''' Bestimmt, ob ein Proxy Server verwendet werden soll.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  DefaultValue(GetType(System.Boolean), "False"), _
  Description("Bestimmt, ob ein Proxy Server verwendet werden soll.")> _
  Public Property UseProxy() As Boolean
    Get
      Return m_UseProxy
    End Get
    Set(ByVal value As Boolean)
      m_UseProxy = value
    End Set
  End Property
  ''' <summary>
  ''' Bestimmt, ob die Proxy Einstellungen des Internet Explorers 
  ''' verwendet werden sollen.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  DefaultValue(GetType(System.Boolean), "False"), _
  Description("Bestimmt, ob die Proxy Einstellungen des Internet " & _
    "Explorers verwendet werden sollen.")> _
  Public Property UseProxyIESettings() As Boolean
    Get
      Return m_UseProxyIESettings
    End Get
    Set(ByVal value As Boolean)
      m_UseProxyIESettings = value
    End Set
  End Property
  ''' <summary>
  ''' Legt die Adresse für den Proxy Server fest.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  Description("Legt die Adresse für den Proxy Server fest.")> _
  Public Property ProxyServer() As String
    Get
      Return m_ProxyServer
    End Get
    Set(ByVal value As String)
      m_ProxyServer = value
    End Set
  End Property
  ''' <summary>
  ''' Legt den Port des Proxy Servers fest.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  DefaultValue(GetType(System.Int32), "8080"), _
  Description("Legt den Port des Proxy Servers fest.")> _
  Public Property ProxyPort() As Integer
    Get
      Return m_ProxyPort
    End Get
    Set(ByVal value As Integer)
      m_ProxyPort = value
    End Set
  End Property
  ''' <summary>
  ''' Legt den Benutzernamen des Proxy Servers fest.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  Description("Legt den Benutzernamen des Proxy Servers fest.")> _
  Public Property ProxyUserName() As String
    Get
      Return m_ProxyUserName
    End Get
    Set(ByVal value As String)
      m_ProxyUserName = value
    End Set
  End Property
  ''' <summary>
  ''' Legt das Passwort des Proxy Servers fest.
  ''' </summary>
  <Category("Proxy"), Bindable(True), _
  PasswordPropertyText(True), _
  Description("Legt das Passwort des Proxy Servers fest.")> _
  Public Property ProxyPassword() As String
    Get
      Return m_ProxyPassword
    End Get
    Set(ByVal value As String)
      m_ProxyPassword = value
    End Set
  End Property
End Class