ASP.NET MVC: возврат образов CDN из контроллера - PullRequest
4 голосов
/ 06 февраля 2012

Я знаю, как вернуть изображение с контроллера MVC, но мне было интересно, если возврат изображения в CDN с контроллера MVC потеряет цель использования CDN для изображений.Приведет ли использование следующего кода к тому, что веб-сервер, на котором размещено веб-приложение, загружается из CDN и затем становится доступным для загрузки пользователем с веб-сервера?Загружается ли изображение дважды: один раз с CDN на веб-сервер, а затем с веб-сервера на пользователя?Если так, то это хуже, чем размещение изображений непосредственно на веб-сервере?Или образ загружается только один раз, напрямую из CDN конечному пользователю?

Как мне вернуть изображение с контроллера MVC и одновременно воспользоваться преимуществами CDN?

    public ActionResult Thumb(int id)
    {
        //process 
        var file = Server.MapPath(" path to image in the CDN ");
        //do your stuff
        return File(file, "image/jpg", Path.GetFileName(file));
    }

Ответы [ 6 ]

8 голосов
/ 06 февраля 2012

В вашем действии контроллера вам нужно выполнить HTTP-запрос для получения изображения с удаленного сервера:

public ActionResult Thumb(int id)
{
    using (var client = new WebClient())
    {
        byte[] image = client.DownloadData("http://cdn.foo.com/myimage.jpg");
        return File(image, "image/jpg");
    }
}

и затем:

<img src="@Url.Action("Thumb")" alt="" />

Очевидно, что теперь изображение загружается дважды. Один раз в контроллере от CDN и один раз от клиента. Это полностью противоречит цели этого действия контроллера, и вы можете напрямую ссылаться на изображение из CDN:

<img src="http://cdn.foo.com/myimage.jpg" alt="" />

Очевидно, это предполагает, что клиент имеет доступ к CDN.

Конечно, если действие вашего контроллера не просто извлекает изображение из CDN и передает его клиенту, как, например, извлекает изображение из CDN и изменяет его размер, то вам определенно следует воспользоваться первым подходом.

1 голос
/ 19 мая 2016

Предполагая, что вам необходимо сначала выполнить некоторые вычисления, чтобы выяснить ресурс, например выполнить поиск на основе некоторого идентификатора, чтобы разрешить URL-адрес CDN. Вы абсолютно не должны использовать веб-клиент и загружать изображение в байтовый массив. Если вам нужно загрузить файл, он по сути становится энергозависимым ресурсом, и вам нужно решить, как с ним работать, используя прерыватель цепи, возможно, без кеша, и вам нужно буферизовать его так, чтобы он не использовался слишком много памяти.

В этом случае вам лучше разрешить URL-адрес и использовать перенаправление 301/302 в зависимости от варианта использования.

public ActionResult Thumb(int id)
{
    //resolve url
    var file = " path to image in the CDN ";
    //redirect permanent
    return RedirectPermanent(file);
    //OR redirect 
    return Redirect(file);
}
1 голос
/ 29 июля 2012

Конфигурации CDN могут отличаться, но наиболее распространенная настройка заключается в том, что сервер CDN будет выступать в качестве большого распределенного прокси для вашего сервера («исходного сервера»).

CDN не имеет значения, как выдоставить ваш контент.Вы можете указать это для прокси для контента по URL, по типу контента или по другим факторам.

Таким образом, ваша ситуация, предполагающая, что контент, доставленный из контроллера, не изменится, может быть настроен следующим образом:

  1. Запрос к серверу CDN
  2. Запросы сервера CDN к методу вашего контроллера на исходном сервере
  3. Метод контроллера генерирует контент
  4. Кэши CDN контентадля последующих запросов
  5. CDN возвращает содержимое
  6. Последующие запросы для того же содержимого по URL-адресу возвращаются из CDN

Наиболее важным фактором при возврате статического содержимого являетсяиспользуемая вами структура URL.

CDN (может) заботится о заголовках ответа с точки зрения кэширования и срока действия, но этого лучше избегать, если вы можете правильно изобразить URL, чтобы предоставить уникальный контент по URL (чтобы решитьнапример, проблемы с версиями).

Если вы пытаетесь защитить контент, это также возможно с CDN, но обычно требует CDNМетоды.

1 голос
/ 07 февраля 2012

Я использую URL Rewrite модуль 2.0 outboundRules.Изменение ответа html Img (изображения), ссылки (css), сценарии (js), теги url.

Справочник по конфигурации модуля перезаписи URL 2.0: Модуль перезаписи URL 2: Модуль перезаписи URL: Официальный сайт Microsoft IIS

Текущий ответ

...
<img src="/images/photo1.jpg" />
<img src="/images/photo2.jpg" />
...

Установить конфигурацию urlrewrite web.config.

<rewrite>
    <outboundRules>
        <rule name="cdn" preCondition="html" enabled="true">
            <match filterByTags="Img, Link, Script" 
                        pattern="^/(images|csc|js)/(.*)" />
            <action type="Rewrite" value="//cdn.local/{R:1}/{R:2}" />
        </rule>
        <preConditions>
            <preCondition name="html">
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="text/html" />
            </preCondition>
        </preConditions>
    </outboundRules>
</rewrite>

Переписать ответ

...
<img src="//cdn.local/images/photo1.jpg" />
<img src="//cdn.local/images/photo2.jpg" />
...

Надеюсь, что эта помощь.

1 голос
/ 06 февраля 2012

Не возвращайте реальное изображение с контроллера.Это хуже, потому что тогда вы скачиваете его дважды (CDN -> сервер -> клиент).Вам не нужно Thumb действие вообще.

Если вам нужно сгенерировать ссылку на файл в CDN в контроллере, просто добавьте свойство в модель представления для ссылки (ссылок) CDN и установите его в контроллере.

Создайте ссылку в вашем контроллере:

public ActionController SomeAction(int id){
   var model = new SomeActionViewModel();

   model.CDNLink = // do some stuff to generate CDN Link and set them on the model;
   return View(model);
}

Затем, наконец, установите ее в своем представлении

<img src="@Model.CDNLink" alt=""/>
1 голос
/ 06 февраля 2012

Server.MapPath используется для сопоставления физического пути к изображению, он не собирается ничего делать для образа CDN, потому что он не существует локально по физическому пути. И нет, вы не хотите возвращать файл.

Ваш HTML будет просто ссылаться на изображение CDN в теге <img>. т.е.

<img src="http://mycdn.com/image" />
...