2012-04-25 9 views
2

У меня есть большое унаследованное приложение, и я хотел бы переместить все наши изображения в CDN.Переопределить разрешение ASP.NET tilde (~) только для изображений

В настоящее время все наши изображения находятся под корнем приложения, поэтому пути все равны "~/Images/MyImage.jpg." В соответствии с требованиями нашей системы, я ДОЛЖЕН определить полный URL-адрес для данного изображения во время выполнения, если он должен жить в CDN. Это дает нам жесткий контроль над версиями, кэшированием и т. Д. Изменение кода изображения по изображению будет очень длительным, утомительным и подверженным ошибкам процессу.

Что я хотел бы сделать, так это возможность подключиться к некоторому механизму в ASP.NET, где я могу решить, как я хочу разрешить тильду для изображения. Это позволило бы сохранить весь наш существующий код как есть, и изображения будут переданы CDN во время выполнения.

Я нашел несколько упоминаний VirtualPathProviders, которые звучали, как это могло бы быть то, что я искал, но когда я тестировал его, единственные пути передается в CombineVirtualPaths функции были пути, которые заканчивались .ASPX, .ASCX, and .MASTER.

Может ли кто-нибудь помочь мне найти чистый вариант с низким уровнем риска для этого?

В принципе, мне нужно, чтобы где-нибудь в моем приложении, где у меня есть «~/images/myimage.jpg», который будет отображаться в браузере как «http://mycdnhost.com/myimage.jpg». Это позволит избежать отправки браузером запроса на наш сервер для изображения вообще.

+0

Что такое версия IIS, которую вы используете? –

+0

Обратите внимание на возможное решение: http://stackoverflow.com/questions/4350571/changing-asp-net-application-root – Soliah

ответ

3

Использование IIS маршрутизации

Обслуживание статического контента с другого сайта или сервера. Ваше веб-приложение развертывается на нескольких серверах таким образом, что динамический веб-контент размещается на одном сайте или сервере, а все статическое содержимое находится на другом сайте или сервере. Вы можете использовать модуль URL Rewrite вместе с модулем маршрутизации запросов приложений IIS для пересылки всех запросов на статические файлы на другой сервер, одновременно обслуживая все запросы для динамических веб-страниц с текущего сервера. Таким образом, маршрутизация ASP.NET используется только для динамического веб-контента и не оценивает URL-адреса для статического контента.

Следующий пример показывает правило перезаписи URL, который вы можете использовать для этого сценария:

<rewrite> 
    <rules> 
     <rule name="Forward to static file server"> 
      <match url="^.+\.(?:jpg|bmp|gif)$" /> 
      <action type="Rewrite" url="http://static_file_server/{R:0}" /> 
     </rule> 
    </rules> 
</rewrite> 

Более подробную информацию по адресу: //learn.iis.net/page.aspx/496/iis-url -rewriting-и-САШ маршрутизации/

Использование HttpModule

  1. Вы должны попытаться создать HttpModule, что перехватывают запрос изображения и попытаться красный направьте их на ваш путь CDN. Во-первых, вам нужно сопоставить расширение файла образа с файлом aspnet_isapi в IIS. Затем добавьте httpmodule, который выполняет перенаправление URL для этого расширения файла. Например, в методе BeginRequest модуля:

    недействительными (отправитель объекта, EventArgs е) context_BeginRequest { , если (request.url.endwith .jpg/.png ...) перенаправление на пути относительно корня папка. }

  2. Другим вариантом использования httpmodule является перехват html-рендеринга и замена URL-адресов изображений с использованием регулярного выражения для указания на CDN. здесь вы можете увидеть, как это работает http://shoaibsheikh.blogspot.com/2012/05/change-image-url-in-aspnet-using.html

Этот метод поставит над головой на asp.net lifecyle, потому что мы будем перехватывать всю страницу, прежде чем его было отправлено клиенту.

Использование управляющих адаптеров

Вы должны попробовать ASP.Net управления Адаптеры, если вы хотите обрабатывать только элементы управления изображения для угона Control Image метод визуализации и выборочно изменить путь к ТПС URL. Этот метод является менее рискованным и съемным.

public class CDNImageControlAdapter : ControlAdapter 
    { 
     protected override void Render(HtmlTextWriter writer) 
     { 
      Image img = this.Control as Image; 
      if (img == null) 
      { 
       base.Render(writer); 
       return; 
      } 

      if (img.ImageUrl.Length > 0) 
      { 
       // Let the HyperLink render its begin tag 
       img.RenderBeginTag(writer); 

       Image image = new Image(); 

       if (img.ImageUrl.IndexOf("~") == 0) 
       { 
        img.ImageUrl = (img.ImageUrl.Replace("~", "http://mycdn.com/images/")); 

       } 

       img.RenderControl(writer); 
      } 
      else 
      { 
       // HyperLink.RenderContents handles a couple of other 
       // cases if its ImageUrl property hasn't been set. We 
       // delegate to that behavior here. 
       base.Render(writer); 
      } 
     } 
    } 

и добавить All.broswer файл это в App_Browsers папке приложения

<!-- 
    You can find existing browser definitions at 
    <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 
--> 
<browsers> 
    <browser id="Default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.UI.WebControls.Image" adapterType="CDNImageControlAdapter, MyWebApplication" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

С уважением.

+0

код не проверен, вы должны интегрировать и отлаживать. –

+0

Это решение не было бы идеальным для меня, потому что это касается только управления Image. Я хочу обратиться в ЛЮБОЕ, что путь изображения задан тильдой. Это может быть любое количество свойств для любого количества элементов управления WebControls, HtmlControls или сторонних разработчиков. Мне нужно универсальное исправление. –

+0

хорошо, я думал, что вас беспокоит контроль над изображением. В вашем случае вы должны попробовать использовать httpmodule, но для этого вам придется сопоставлять расширения изображений, которые должны быть переданы через управляемый модуль isapi, который может нанести ущерб процессу asp.net на сервере, но это вариант. –

 Смежные вопросы

  • Нет связанных вопросов^_^