gpt4 book ai didi

c# - 如何在 HttpModule 中执行 XSLT 转换?

转载 作者:行者123 更新时间:2023-11-30 14:43:10 26 4
gpt4 key购买 nike

我一直在尝试将服务器端 XSLT 转换实现为 IIS HttpModule。我的基本方法是在 BeginRequest 安装一个新过滤器,将写入转移到 MemoryStream,然后在 PreSendRequestContent 使用 XSLT 转换文档并将其写入原始输出流。但是,即使不执行转换,我显然也做错了,因为 HttpModule 似乎适用于第一个页面加载,然后在我重新启动应用程序池之前我根本得不到服务器的响应。转换到位后,我第一次得到一个空白页面,然后没有响应。我显然在做一些愚蠢的事情,但这是我多年来编写的第一个 C# 代码(也是我第一次尝试使用 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());
}

}

}

最佳答案

当您完成将数据读入 MemoryStream 时,该位置位于流的末尾。在将流发送到 StreamReader/XmlReader 之前,您需要将位置重置为 0。

stream.Position = 0;
/* or */
stream.Seek(0, SeekOrigin.Begin);

关于c# - 如何在 HttpModule 中执行 XSLT 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com