Как настроить IIS для SVG и веб-тестирования с помощью Visual Studio?

14

Допустим, у меня есть простая веб-страница с изображением svg:

<img src="foobar.svg" alt="not working" />

Если я сделаю эту страницу как статическую html-страницу и просматриваю ее непосредственно, отображается svg. Если я наберу адрес этого svg - он отображается.

Но когда я делаю это как страницу ASPX и запускаю ее динамически из Visual Studio, я получаю altтекст. Если я наберу адрес этого svg (с локального хоста, а не как локальный файл) - браузер пытается загрузить его вместо отображения.

Я уже определил тип MIME в IIS (для всего сервера - "image / svg + xml") и перезапустил IIS. Тот же эффект, что и раньше.

Вопрос: что мне делать больше?

Обновить

WireShark не будет работать (он есть в документации), я попробовал также RawCap, но он не может отследить мое соединение (странно), к счастью, Fiddler работал:

От клиента:

GET http://127.0.0.1:1731/svg/document_edit.svg HTTP/1.1
Host: 127.0.0.1:1731
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

Ответ с сервера:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 16 Feb 2012 11:14:38 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 87924
Connection: Close

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:

*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

Для записи вот полезные вопросы и ответы для Fiddler: /programming/826134/how-to-display-localhost-traffic-in-fiddler- while-debugging-an-asp-net- applicati

greenoldman
источник
Думаю, вы можете получить лучшие ответы на это на SO. Короче говоря, предполагая, что ASPX уже работает, вам нужно испустить SVG как MIME-тип со страницы ASPX, чтобы браузер поверил, что это файл SVG. Вы, по-видимому, пытаетесь динамически испустить SVG со страницы? Если это так, AFAIK, если он работает как одна страница, он будет работать в записи IMG.
TristanK
@TristanK, aspx не генерирует «SVG как тип MIME», он просто содержит, <img src...как показано выше, aspx «переводится» на полную HTML-страницу, но отправка всего содержимого (html, а затем svg) выполняется IIS.
Гринольдман
Я до сих пор не понимаю, что вы описываете, но я думаю, что это вопрос разработки, поэтому лучше задать его в StackOverflow.
TristanK
2
Возьмите копию Fiddler и проследите два разных запроса. Это может дать вам некоторые подсказки относительно того, почему прямой запрос изображения ведет себя по-разному в каждом из этих случаев. Подсказки, скорее всего, будут в возвращаемых заголовках. Без этих данных все, что мы можем сделать, - это угадать, какие ответы возвращает ваш сервер.
Кев
@macias Как сказал Кев, вам нужно отслеживать трафик. Скрипач или старый добрый Wireshark должен быть в состоянии поднять это.
Крис С

Ответы:

14

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

Server: ASP.NET Development Server/10.0.0.0

Если бы это обслуживалось IIS7, мы бы увидели:

Server: Microsoft-IIS/7.5

Встроенный веб-сервер Visual Studio имеет только ограниченный набор типов MIME, которые он может обслуживать, и не знает типов MIME, установленных для IIS7. Я написал ответ на аналогичную проблему в Stack Overflow некоторое время назад:

Настройка типов MIME с использованием сервера разработки ASP.NET

Встроенный сервер обслуживает ваш .svgфайл как:

Content-Type: application/octet-stream

Вероятно, именно это заставляет браузер запрашивать загрузку.

В Visual Studio убедитесь, что вы используете IIS Express, открыв свойства проекта своего сайта и выбрав вкладку «Интернет» в списке вертикальных вкладок:

введите описание изображения здесь

Если у вас не установлен IIS 7.5 Express, вы можете получить его здесь:

http://www.microsoft.com/download/en/details.aspx?id=1038

Вам понадобится Visual Studio 2010 с пакетом обновления 1, чтобы воспользоваться всеми преимуществами:

http://support.microsoft.com/kb/983509

Поддержка IIS Express

Visual Studio 2010 SP1 позволяет использовать Internet Information Services (IIS) 7.5 Express в качестве локального хост-сервера для веб-сайта и проектов веб-приложений.

Примечание. IIS 7.5 Express не входит в состав пакета обновления 1 (SP1), и его необходимо загружать отдельно. Для получения дополнительной информации посетите следующий блог: http://weblogs.asp.net/scottgu/archive/2011/01/03/vs-2010-sp1-beta-and-iis-developer-express.aspx

Когда вы это сделаете, вы можете добавить .svgMIME-тип в web.configфайл вашего приложения :

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>
Кев
источник
Большое спасибо. В моем случае все пошло иначе - для переключения на IIS (у меня ISS, а не ISSExpress) мне пришлось запустить VS в режиме администратора, после этого все было - я не определил svg в web.config, потому что определил это уже в IIS.
Гринольдман
2

Как упомянуто выше, Cassini игнорирует эти настройки в web.config, поэтому вместо них нужно использовать IIS Express (в настройках проекта VS) /programming/5924647/setting-mime-types-using-the-asp- нетто-разработка-сервер

Для получения дополнительной информации о том, как настроить типы MIME с помощью пользовательского интерфейса администратора или с помощью web.config для IIS или IIS Express, см. Http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4- in-iis-for-a-website-or-global / и http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4-to-web-config-in-iis-7 /

Джордж Бирбилис
источник
Вы задаете это как новый вопрос или риторически? Если первое, пожалуйста, задайте новый вопрос с полной информацией. Если последнее, то это, вероятно, должен быть комментарий - в его нынешнем виде это очень плохой ответ ( см. Здесь, почему )
voretaq7
переработано с лучшими ссылками
Джордж Бирбилис
намного лучше :-)
voretaq7
2

Я использовал Kev ответ:

  1. Установка IIS 8.0 Express из установщика веб-платформы
  2. Изменение свойств проекта для использования IIS Express и создание виртуального каталога для него
  3. Добавление в конфигурацию web.config → system.webServer
<staticContent>
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>
Владимир Котыло
источник
2

Мой обходной путь для этого состоял в том, чтобы создать свой собственный httphandler локально, который переписал бы тип контента для svg.

public class SvgHandler : IHttpHandler
{

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/svg+xml";
        context.Response.BinaryWrite(File.ReadAllBytes(context.Request.PhysicalPath));
        context.Response.End();
    }
}

и в web.config я добавил:

<httpHandlers>
  <add verb="*" path="*.svg" type="SvgHandler" />
</httpHandlers>

С этим решением вам не нужно использовать IIS Express, вы можете просто использовать обычный сервер разработки в Visual Studio 2010

Робин Карлссон
источник
1
Это довольно грубо, что такого рода вещи должны случиться ...
Джаррод Мозен
1

Я использую IIS7 и смог это исправить, щелкнув правой кнопкой мыши на сервере в IIS и выбрав свойства. Затем я нажал на кнопку MIME Types ... Затем я нажал «Новый». Для расширения я набрал .svg. Для MIME Type я набрал изображение / svg + xml. Затем я сохранил все и сделал iisreset из командной строки. Работал отлично.

Трой Табор
источник