经过深入研究,结果发现几乎无法覆盖这些文件的呈现过程。因此,唯一的选择是使用肮脏、恶劣的Hack手段!
protected void Page_Load(object sender, EventArgs e)
{
Response.Filter = new WebResourceResponseFilter(Response.Filter);
}
public class WebResourceResponseFilter : Stream
{
private Stream baseStream;
public WebResourceResponseFilter(Stream responseStream)
{
if (responseStream == null)
throw new ArgumentNullException("ResponseStream");
baseStream = responseStream;
}
public override bool CanRead
{
get { return baseStream.CanRead; }
}
public override bool CanSeek
{
get { return baseStream.CanSeek; }
}
public override bool CanWrite
{
get { return baseStream.CanWrite; }
}
public override void Flush()
{
baseStream.Flush();
}
public override long Length
{
get { return baseStream.Length; }
}
public override long Position
{
get
{
return baseStream.Position;
}
set
{
baseStream.Position = value;
}
}
public override int Read(byte[] buffer, int offset, int count)
{
return baseStream.Read(buffer, offset, count);
}
public override long Seek(long offset, System.IO.SeekOrigin origin)
{
return baseStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
baseStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
string originalText = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
originalText = originalText.Replace("/WebResource.axd", "WebResource.axd");
buffer = System.Text.Encoding.UTF8.GetBytes(originalText);
this.baseStream.Write(buffer, 0, buffer.Length);
}
这个代码截获了页面的流并将所有出现的 "/WebResource.axd" 替换为 "WebResource.axd"。由于它是相对路径,所以解析非常好!
我想到了另一个解决方法,需要将Web应用程序安装到模拟 "/social" 关键字重定向的虚拟目录中。这将导致asp.net更新 HttpRuntime.AppDomainAppVirtualPath 以在页面上的引用中包含 "/social" 并因此正确解析。
大喊一声!