Изменить запрошенный URL-адрес WebResource.axd

Мое веб-приложение (http://www.something.com/social/competition/) в настоящее время запрашивает файл WebResource.axd, например:

<script src="/WebResource.axd?d=xxx" type="text/javascript"></script>

Поскольку мы используем URL-адреса в Netscaler для пересылки всех запросов к папке "/ social" на отдельную ферму серверов, содержащую это приложение, корневой путь "/" не будет разрешен правильно, так как он будет запрашивать ресурс у объекта.com приложение.

Поэтому мне нужно изменить URL запрошенного скрипта, чтобы запросить его явно:

<script src="/social/WebResource.axd?d=xxx" type="text/javascript"></script>

или запросить его, используя относительный путь:

<script src="WebResource.axd?d=xxx" type="text/javascript"></script>

До сих пор я рассматривал переопределение метода рендеринга, использование адаптера управления и многое другое, но пока ничего не получил. Помогите, пожалуйста.

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". Поскольку это относительный путь, он прекрасно решается!

Мне пришло в голову другое решение, которое требовало установки веб-приложения в виртуальный каталог, который имитировал перенаправление ключевого слова "/social". Это приведет к тому, что asp.net обновит HttpRuntime.AppDomainAppVirtualPath, чтобы включить "/social" в ссылки на странице, и, следовательно, разрешится правильно.

Большой возглас

Другие вопросы по тегам