I am trying to implement server side XSLT transformations as IIS HttpModule. My main approach is to install a new filter in BeginRequest, which translates the entries into a MemoryStream and then into PreSendRequestContent to convert the document using XSLT and write it to the original output stream. However, even without performing the conversion, I obviously am doing something wrong, since the HttpModule works to load the first page, and then I donβt get any response from the server at all until I restart the application pool. With the conversion to place, I get a blank page for the first time, and then no response. I'm obviously doing something stupid, but this is the first C # code I wrote in a few years (and my first attempt at an HttpModule), and I have no idea what the problem is.What mistakes am I making? (I commented out part of XSLT in the code below and uncommented the line that writes the contents of the cache in response.)
using System;
using System.IO;
using System.Text;
using System.Web;
using System.Xml;
using System.Xml.Xsl;
namespace Onyx {
public class OnyxModule : IHttpModule {
public String ModuleName {
get { return "OnyxModule"; }
}
public void Dispose() {
}
public void Init(HttpApplication application) {
application.BeginRequest += (sender, e) => {
HttpResponse response = HttpContext.Current.Response;
response.Filter = new CacheFilter(response.Filter);
response.Buffer = true;
};
application.PreSendRequestContent += (sender, e) => {
HttpResponse response = HttpContext.Current.Response;
CacheFilter cache = (CacheFilter)response.Filter;
response.Filter = cache.originalStream;
response.Clear();
response.Write(cache.ToString());
response.Flush();
};
}
}
public class CacheFilter : MemoryStream {
public Stream originalStream;
private MemoryStream cacheStream;
public CacheFilter(Stream stream) {
originalStream = stream;
cacheStream = new MemoryStream();
}
public override int Read(byte[] buffer, int offset, int count) {
return cacheStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count) {
cacheStream.Write(buffer, offset, count);
}
public override bool CanRead {
get { return cacheStream.CanRead; }
}
public override string ToString() {
return Encoding.UTF8.GetString(cacheStream.ToArray());
}
}
}