저는 서버 측 XSLT 변환을 IIS HttpModule로 구현하려고했습니다. 필자의 기본적인 접근 방식은 BeginRequest에 새로운 필터를 설치하여 MemoryStream에 쓰기를 전환 한 다음 PreSendRequestContent에서 XSLT를 사용하여 문서를 변환하고 원본 출력 스트림에 쓰도록하는 것입니다. 그러나 변환을 수행하지 않고도 HttpModule이 첫 번째 페이지로드에서 작동하는 것처럼 보이고 응용 프로그램 풀을 다시 시작할 때까지 서버에서 전혀 응답을받지 못하기 때문에 분명히 잘못된 작업을 수행하고 있습니다. 변환을 통해 처음에는 빈 페이지를 얻었고 응답은 없었습니다. 나는 분명히 뭔가 어리석은 짓을하고있다. 그러나 이것은 수년 동안 (그리고 HttpModule에서 처음 시도한) C# 코드이며, 문제가 무엇인지 전혀 모른다. 어떤 실수를 저질렀습니까? (나는 아래의 코드에서 XSLT 부분을 주석 처리하고 응답을 캐시의 내용을 기록하는 라인을 주석 처리했습니다.)HttpModule에서 XSLT 변환을 수행하려면 어떻게해야합니까?
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());
}
}
}
아니 범죄 청소기,하지만 샘플 마일 떨어진 그 공상 "클린 코드"일에서이다. – Filburt
@ Filburt - 좀 더 구체적으로 말하십시오. 아니면 스팸 메일 일뿐입니다. –
@Jeff : 좋아요, 단지 두 가지 명백한 포인트가 있습니다. 1) 이름 지정 - (HttpApplication 컨텍스트) 오해의 소지가 있습니다. 2) 모든 것을 Init() 모듈로 초기화해야합니다. – Filburt