首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改WebResource.axd的请求url

更改WebResource.axd的请求url
EN

Stack Overflow用户
提问于 2011-04-04 17:11:33
回答 1查看 6.9K关注 0票数 9

我的web应用程序(http://www.something.com/social/competition/)当前请求WebResource.axd文件,如下所示:

代码语言:javascript
复制
<script src="/WebResource.axd?d=xxx" type="text/javascript"></script>

当我们在Netscaler中使用urlrewiting将对"/social“文件夹的所有请求转发到包含此应用程序的独立服务器场时,"/”根路径将无法正确解析,因为它将从something.com应用程序请求资源。

因此,我需要将请求的脚本的url更改为显式请求:

代码语言:javascript
复制
<script src="/social/WebResource.axd?d=xxx" type="text/javascript"></script>

或者使用相对路径请求它:

代码语言:javascript
复制
<script src="WebResource.axd?d=xxx" type="text/javascript"></script>

到目前为止,我已经研究了重写render方法,使用控件适配器和各种其他东西,但到目前为止还没有真正的进展。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-04 20:35:57

是的,经过广泛的研究发现,覆盖这些文件的渲染过程几乎是不可能的。所以唯一的选择就是一个肮脏,肮脏,可怕的黑客!

代码语言:javascript
复制
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“,因此将正确解析。

大叫大叫!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5536536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档