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 |