J'ai essayé d'implémenter des transformations XSLT côté serveur comme IIS HttpModule. Mon approche de base consiste à installer un nouveau filtre à BeginRequest qui détourne les écritures dans un MemoryStream, puis à PreSendRequestContent pour transformer le document en utilisant XSLT et l'écrire dans le flux de sortie d'origine. Cependant, même sans effectuer la transformation, je fais clairement quelque chose de mal car le HttpModule semble fonctionner pour le premier chargement de la page et ensuite je n'obtiens aucune réponse du serveur jusqu'à ce que je redémarre le pool d'applications. Avec la transformation en place, je reçois une page vide la première fois, puis aucune réponse. Je fais clairement quelque chose de stupide mais c'est le premier code C# que j'ai écrit depuis des années (et ma première tentative à un HttpModule) et je n'ai aucune idée de ce que pourrait être le problème. Quelles erreurs fais-je? (Je l'ai fait remarquer la partie XSLT dans le code ci-dessous et décommenté une ligne qui écrit le contenu du cache de la réponse.)Comment puis-je effectuer des transformations XSLT dans un HttpModule?
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();
/* XmlReader xml = XmlReader.Create(new StreamReader(cache), new XmlReaderSettings() {
ProhibitDtd = false,
ConformanceLevel = ConformanceLevel.Auto
});
XmlWriter html = XmlWriter.Create(response.OutputStream, new XmlWriterSettings() {
ConformanceLevel = ConformanceLevel.Auto
});
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("http://localhost/transformations/test_college.xsl", new XsltSettings() {
EnableDocumentFunction = true
}, new XmlUrlResolver());
xslt.Transform(xml, html); */
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());
}
}
}
Aucune infraction, mais votre échantillon est miles de cette fantaisie "Clean Code" chose. – Filburt
@Filburt - s'il vous plaît soyez plus précis, ou vous ne faites que du spam. –
@Jeff: Ok, juste deux points évidents: 1) Naming - (contexte HttpApplication) est trompeur. 2) entasser tout le matériel dans Init() qui, selon son nom, devrait être Init the Module. – Filburt