This step-by-step article describes how to retrieve the HTML
results of a page as a stream and then download the stream to a file. When you
use the
FileStream object and set the
Response.Filter property to the
FileStream object, all HTTP output that
Response.Write sends also downloads as stream to a file.
Create a Web Form
To create a Web Form:
- In Visual C# .NET, create a new ASP.NET Web Application
project named ASPNETFilter.
- Right-click the designer pane of WebForm1.aspx.
- Click View HTML Source to edit the HTML
code.
- Replace the existing code with the following code :
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="ASPNETFilter.WebForm1" %>
<HTML>
<HEAD>
<title>SaveResponse</title>
</HEAD>
<body>
<form id="SaveResponse" method="post" runat="server">
<asp:TextBox ID="TextBox1" Text="Textbox 1" Runat="server" /><br>
<asp:ListBox ID="Listbox1" Runat="server" Size="3">
<asp:ListItem Value="0">Zero</asp:ListItem>
<asp:ListItem Value="1" Selected="True">One</asp:ListItem>
<asp:ListItem Value="2">Two</asp:ListItem>
</asp:ListBox><br>
<asp:CheckBox ID="Checkbox1" Runat="server" Checked="True" Text="Checkbox 1" />
</form>
</body>
</HTML>
Create the ResponseFilter Class
To create the
ResponseFilter class:
- Add a new class named ResponseFilter.cs.
- Replace the existing code with the following code:
using System;
using System.IO;
namespace ASPNETFilter
{
public class ResponseFilter : Stream
{
private Stream m_sink;
private long m_position;
private FileStream fs;
public ResponseFilter(Stream sink)
{
m_sink = sink;
fs = new FileStream(@"C:\FilterOutput\response.htm", FileMode.OpenOrCreate, FileAccess.Write);
}
// The following members of Stream must be overriden.
public override bool CanRead
{get { return true; }}
public override bool CanSeek
{get { return false; }}
public override bool CanWrite
{get { return false; }}
public override long Length
{get { return 0; }}
public override long Position
{
get { return m_position; }
set { m_position = value; }
}
public override long Seek(long offset, System.IO.SeekOrigin direction)
{
return 0;
}
public override void SetLength(long length)
{
m_sink.SetLength(length);
}
public override void Close()
{
m_sink.Close();
fs.Close();
}
public override void Flush()
{
m_sink.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return m_sink.Read(buffer, offset, count);
}
// Override the Write method to filter Response to a file.
public override void Write(byte[] buffer, int offset, int count)
{
//Write out the response to the browser.
m_sink.Write(buffer, 0, count);
//Write out the response to the file.
fs.Write(buffer, 0, count);
}
}
}
Note Before you run the Web application:
- Create a folder named C:\FilterOutput.
- Grant read and write access on the folder for the
ASPNET user.
Use the Response Filter Class
- In Solution Explorer, select
WebForm1.aspx.
- Right-click and then select View Code.
- Add the following code to theOnInit event code:
Response.Filter = new ResponseFilter(Response.Filter);
Test the ResponseFilter
- Save the changes to the ASPNETFilter Web
project.
- On the Build menu, select Build Solution.
- Start Microsoft Internet Explorer, and then open
WebForm1.aspx by specifying the following URL, where
IISServerName is the name of your Microsoft Internet
Information Services (IIS) server:
http://IISServerName/ASPNETFilter/WebForm1.aspx
- Find the Response.htm file in the C:\FilterOutput
folder.