Допустим, у меня есть простая веб-страница с изображением 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:
Встроенный сервер обслуживает ваш .svg
файл как:
Content-Type: application/octet-stream
Вероятно, это то, что заставляет браузер запрашивать загрузку.
В Visual Studio убедитесь, что вы используете IIS Express, открыв свойства проекта своего сайта и выбрав вкладку «Интернет» в списке вертикальных вкладок:
Если у вас не установлен IIS 7.5 Express, вы можете получить его отсюда:
Чтобы воспользоваться всеми преимуществами, вам понадобится пакет обновления 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
Я использовал ответ Кева:
<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/