1° esempio con i delegati (è più semplice che con gli eventi)
file ResponseFilter.vb
codice:
Public Delegate Function DelegateSetHtml(ByVal html As String) As String
Public Class ResponseFilter
Inherits Stream
Private m_sink As Stream
Private m_position As Long
Private m_function As DelegateSetHtml
Public Sub New(ByVal sink As Stream, ByVal functionHtml As DelegateSetHtml)
Me.m_sink = sink
Me.m_function = functionHtml
End Sub
Public Overrides ReadOnly Property CanRead() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanSeek() As Boolean
Get
Return False
End Get
End Property
Public Overrides ReadOnly Property CanWrite() As Boolean
Get
Return False
End Get
End Property
Public Overrides Sub Flush()
Me.m_sink.Flush()
End Sub
Public Overrides ReadOnly Property Length() As Long
Get
Return 0
End Get
End Property
Public Overrides Property Position() As Long
Get
Return Me.m_position
End Get
Set(ByVal Value As Long)
Me.m_position = Value
End Set
End Property
Public Overrides Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
Return Me.m_sink.Read(buffer, offset, count)
End Function
Public Overrides Function Seek(ByVal offset As Long, ByVal origin As System.IO.SeekOrigin) As Long
Return 0
End Function
Public Overrides Sub SetLength(ByVal value As Long)
Me.m_sink.SetLength(value)
End Sub
Public Overrides Sub Close()
Me.m_sink.Close()
End Sub
Public Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
Dim Html As String = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count)
Html = Me.m_function(Html)
buffer = System.Text.UTF8Encoding.UTF8.GetBytes(Html)
Me.m_sink.Write(buffer, 0, buffer.Length)
End Sub
End Class
pagina di esempio intercettare html.aspx
codice:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="intercettare html.aspx.vb" Inherits="CorsoApogeo_leggere_il_contenuto_html_della_pagina_intercettare_html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Pagina senza titolo</title>
<link href="../../stili/Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Intercettare html con delegati</h1>
<h3>PIETRO</h3>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server">Nicola</asp:TextBox></p>
<asp:TextBox ID="TextBox2" runat="server" Visible="false"></asp:TextBox></p>
<asp:Button ID="Button1" runat="server" Text="Intercetta html"></asp:Button></p>
</form>
</body>
</html>
codice sottostante
codice:
Option Strict On
Partial Class CorsoApogeo_leggere_il_contenuto_html_della_pagina_intercettare_html
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Inserire qui il codice utente necessario per inizializzare la pagina
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Response.Filter = New ResponseFilter(Response.Filter, AddressOf modificaHtml)
End Sub
Public Function modificaHtml(ByVal html As String) As String
Dim FileName As String = "c:\tmp\response.htm"
Try
html = html.Replace("PIETRO", "--- " & Me.TextBox1.Text & " ---")
File.WriteAllText(FileName, html, Encoding.UTF8)
Catch ex As Exception
html &= "<script>alert('Errore nella scrittura del file');</script>"
End Try
Return html
End Function
Public Function modificaHtml_old(ByVal html As String) As String
Dim fs As FileStream = Nothing
Dim buffer As Byte()
Try
fs = New FileStream("c:\tmp\response.htm", FileMode.OpenOrCreate, FileAccess.Write)
html = html.Replace("PIETRO", "----NICOLA---")
buffer = System.Text.UTF8Encoding.UTF8.GetBytes(html)
fs.Write(buffer, 0, buffer.Length)
Catch ex As Exception
html &= "<script>alert('Errore nella scrittura del file');</script>"
Finally
If Not (fs Is Nothing) Then fs.Close()
End Try
Return html
End Function
End Class
2° esempio che fa uso degli eventi
file ResponseFilterWithEvent.vb
codice:
Public Class ResponseFilterWithEvent : Inherits Stream
Public Event onHTML As onHTML
Private m_sink As Stream
Private m_position As Long
Public Sub New(ByVal sink As Stream)
Me.m_sink = sink
End Sub
Public Overrides ReadOnly Property CanRead() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanSeek() As Boolean
Get
Return False
End Get
End Property
Public Overrides ReadOnly Property CanWrite() As Boolean
Get
Return False
End Get
End Property
Public Overrides Sub Flush()
Me.m_sink.Flush()
End Sub
Public Overrides ReadOnly Property Length() As Long
Get
Return 0
End Get
End Property
Public Overrides Property Position() As Long
Get
Return Me.m_position
End Get
Set(ByVal Value As Long)
Me.m_position = Value
End Set
End Property
Public Overrides Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
Return Me.m_sink.Read(buffer, offset, count)
End Function
Public Overrides Function Seek(ByVal offset As Long, ByVal origin As System.IO.SeekOrigin) As Long
Return 0
End Function
Public Overrides Sub SetLength(ByVal value As Long)
Me.m_sink.SetLength(value)
End Sub
Public Overrides Sub Close()
Me.m_sink.Close()
End Sub
Public Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
Dim Html As String = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count)
Dim e As New ResponseFilterEventArgs()
e.HTML = Html
RaiseEvent onHTML(Me, e)
Html = e.HTML
buffer = System.Text.UTF8Encoding.UTF8.GetBytes(Html)
Me.m_sink.Write(buffer, 0, buffer.Length)
End Sub
End Class
'classe personale di evento
Public Class ResponseFilterEventArgs
Private _HTML As String = ""
Public Property HTML() As String
Get
Return Me._HTML
End Get
Set(ByVal value As String)
Me._HTML = value
End Set
End Property
End Class
'delegate che definisce l'evento
Public Delegate Sub onHTML(ByVal sender As Object, ByVal e As ResponseFilterEventArgs)
la pagina di esempio è uguale alla prima, mentre il codice sottostante è:
codice:
Option Strict On
Partial Class CorsoApogeo_leggere_il_contenuto_html_della_pagina_intercettare_html_con_eventi
Inherits System.Web.UI.Page
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
'creo una istanza della classe ResponseFilterWithEvent
Dim j As New ResponseFilterWithEvent(Me.Response.Filter)
'aggancio l'evento onHTML
AddHandler j.onHTML, AddressOf Me.modificaHtml
'filtro l'html
Me.Response.Filter = j
End Sub
'evento lanciato da ResponseFilterWithEvent
Private Sub modificaHtml(ByVal Sender As Object, ByVal e As ResponseFilterEventArgs)
'file su cui voglio salvare l'html
Dim FileName As String = "c:\tmp\response.htm"
'recupero l'html
Dim html As String = e.HTML
Try
'modifico l'html
html = html.Replace("PIETRO", "--- " & Me.TextBox1.Text & " ---")
'scrivo la pagina html modificata
File.WriteAllText(FileName, html, Encoding.UTF8)
Catch ex As Exception
'altrimenti messaggio di errore
html &= "<script>alert('Errore nella scrittura del file');</script>"
End Try
'restituisco l'html modificato per essere mandato al browser
e.HTML = html
End Sub
End Class
ps. se trovi errori, io sono qui