Назад | Перейти на главную страницу

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

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

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

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

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

Я уже определил тип 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: https://stackoverflow.com/questions/826134/how-to-display-localhost-traffic-in-fiddler- while-debugging-an-asp-net-applicati

Судя по трассировке 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

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

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

Поддержка IIS Express

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

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

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

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>

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

Как упоминалось выше, Cassini игнорирует эти настройки в web.config, поэтому вместо этого нужно использовать IIS Express (в настройках проекта VS) https://stackoverflow.com/questions/5924647/setting-mime-types-using-the-asp-net-development-server

Дополнительные сведения о настройке типов 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/

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

Если у вас есть доступ к IIS, это также решает проблему: http://httpjunkie.com/2014/884/svg-no-iis/