我的网络应用程序(http://www.something.com/social/competition/)目前正在请求WebResource.axd文件:
<script src="/WebResource.axd?d=xxx" type="text/javascript"></script>
由于我们在Netscaler中使用urlrewiting将“/ social”文件夹的所有请求转发到包含此应用程序的单独服务器场,因此“/”根路径将无法正确解析,因为它将请求资源来自something.com应用程序。
因此,我需要更改所请求脚本的url以明确请求它:
<script src="/social/WebResource.axd?d=xxx" type="text/javascript"></script>
或使用相对路径请求它:
<script src="WebResource.axd?d=xxx" type="text/javascript"></script>
到目前为止,我已经看过覆盖渲染方法,使用控制适配器和其他各种东西,但还没有到目前为止。请帮助。
答案 0 :(得分:10)
是的,经过广泛研究后发现,实际上不可能覆盖这些文件的渲染过程。所以唯一的另一个选择是一个肮脏,肮脏,可怕的黑客!
protected void Page_Load(object sender, EventArgs e)
{
//Initialises my dirty hack to remove the leading slash from all web reference files.
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)
{
//Get text from response stream.
string originalText = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
//Alter the text.
originalText = originalText.Replace("/WebResource.axd", "WebResource.axd");
//Write the altered text to the response stream.
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”,因此可以正确解析。
大呐喊!