【问题标题】:Change the requested url of WebResource.axd更改 WebResource.axd 的请求 url
【发布时间】:2011-04-04 09:11:32
【问题描述】:

我的网络应用程序 (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>

到目前为止,我已经研究了覆盖渲染方法,使用控制适配器和其他各种东西,但到目前为止还没有真正实现。请帮忙。

【问题讨论】:

    标签: c# asp.net visual-studio-2008


    【解决方案1】:

    是的,经过大量研究后发现,几乎不可能覆盖这些文件的渲染过程。所以唯一的其他选择是肮脏、肮脏、可怕的黑客攻击!

    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”,从而正确解析。

    大声呐喊!

    【讨论】:

    • originalText = originalText.Replace(HttpContext.Current.Request.ApplicationPath+"/", VirtualPathUtility.MakeRelative(HttpContext.Current.Request.Url.AbsolutePath, "~/"));此行将使所有绝对链接成为相对链接,获取正确的 ../ 元素。
    • 我阅读了这个问题,尝试并使用了这个代码 - 并投了赞成票。这只是改进针对一般情况发布的代码的一般性建议。
    • 这在这种情况下不起作用,因为由于内容切换,应用程序不知道“/social”路径。
    • @JamesLaw - 我也面临同样的问题,我无法理解您关于模仿“/social”关键字的第二个建议。目前我们有一个负载均衡器,它向我们的站点发出请求。所以站点的 url 变成了 root + 主机名,我们使用了 reportviewer 控件,它会自动调用 webresource.axd 来加载控件。你能提出一些相同的建议吗?
    • @Punit 您需要在 IIS 中创建一个虚拟应用程序并在其中托管您的代码。例如,在我的情况下,我会在我的根网站上创建指向该应用程序的虚拟应用程序“社交”,从而使 localhost/social 充当应用程序根目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多