Jak skonfigurować IIS do SVG i testowania sieci za pomocą Visual Studio?

14

Załóżmy, że mam prostą stronę internetową z obrazem svg:

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

Jeśli utworzę tę stronę jako statyczną stronę HTML i wyświetlę ją bezpośrednio, wyświetli się svg. Jeśli wpiszę adres tego pliku svg - zostanie wyświetlony.

Ale kiedy utworzę to jako stronę .aspx i uruchamiam dynamicznie z Visual Studio, otrzymuję alttekst. Jeśli wpisuję adres tego pliku SVG (z localhost, a nie jako plik lokalny) - przeglądarka próbuje go pobrać zamiast wyświetlać.

Zdefiniowałem już typ MIME w IIS (dla całego serwera - „image / svg + xml”) i zrestartowałem IIS. Taki sam efekt jak poprzednio.

Pytanie: co powinienem zrobić więcej?

Aktualizacja

WireShark nie działa (jest w dokumentacji), próbowałem również RawCap, ale nie mogę wyśledzić mojego połączenia (dziwne), na szczęście Fiddler pracował:

Od klienta:

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

Odpowiedź z serwera:

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. ***

Dla przypomnienia, tutaj przydatne pytania i odpowiedzi dotyczące Fiddlera: /programming/826134/how-to-display-localhost-traffic-in-fiddler-while-debugging-an-asp-net-applicati

Greenoldman
źródło
Pomyśl, że możesz uzyskać lepsze odpowiedzi na to na SO. Krótko mówiąc, zakładając, że ASPX już działa, musisz wyemitować SVG jako typ MIME ze strony ASPX, aby przeglądarka uznała, że ​​jest to plik SVG. Prawdopodobnie próbujesz dynamicznie emitować SVG ze strony? Jeśli tak, AFAIK, jeśli działa jako pojedyncza strona, będzie działać z wpisem IMG.
TristanK
@ TristanK, aspx nie emituje „SVG jako typu MIME”, po prostu zawiera, <img src...jak pokazano powyżej, aspx jest „tłumaczony” na pełną stronę HTML, ale wysyłanie całej zawartości (HTML, a następnie SVG) jest wykonywane przez IIS.
greenoldman
Nadal nie rozumiem, co opisujesz, ale myślę, że jest to pytanie programistyczne, więc lepiej byłoby zadać to na StackOverflow.
TristanK
2
Weź kopię Fiddlera, a następnie prześledź dwa różne żądania. To może dać ci wskazówki, dlaczego bezpośrednie żądanie obrazu zachowuje się inaczej w każdym z tych przypadków. Wskazówki najprawdopodobniej znajdą się w zwróconych nagłówkach. Bez tych danych możemy jedynie zgadywać, jakie odpowiedzi zwraca serwer.
Kev
@macias Jak powiedział Kev, będziesz musiał śledzić ruch. Skrzypek lub zwykły stary Wireshark powinien być w stanie go podnieść.
Chris S

Odpowiedzi:

14

Ze śladu Fiddlera wynika, że ​​serwujesz swoje strony za pomocą wbudowanego serwera WWW Visual Studio:

Server: ASP.NET Development Server/10.0.0.0

Gdyby to było obsługiwane przez IIS7, zobaczylibyśmy:

Server: Microsoft-IIS/7.5

Wbudowany serwer sieci Web Visual Studio ma ograniczony zestaw typów MIME, które może obsługiwać i nie ma wiedzy o typach MIME ustawionych dla IIS7. Jakiś czas temu napisałem odpowiedź na podobny problem dotyczący przepełnienia stosu:

Ustawianie typów MIME za pomocą serwera programistycznego ASP.NET

Wbudowany serwer obsługuje twoje .svg plik jako:

Content-Type: application/octet-stream

To prawdopodobnie powoduje, że przeglądarka wyświetla monit o pobranie.

W Visual Studio sprawdź, czy korzystasz z IIS Express, otwierając właściwości projektu witryny i wybierając kartę „Internet” z pionowej listy kart:

wprowadź opis zdjęcia tutaj

Jeśli nie masz zainstalowanego programu IIS 7.5 Express, możesz go pobrać tutaj:

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

Aby w pełni wykorzystać zalety programu Visual Studio 2010 z dodatkiem Service Pack 1:

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

Obsługa IIS Express

Dodatek SP1 dla programu Visual Studio 2010 umożliwia korzystanie z Internetowych usług informacyjnych (IIS) 7.5 Express jako lokalnego serwera hostingowego dla witryny internetowej i projektów aplikacji sieci Web.

Uwaga IIS 7.5 Express nie jest zawarty w dodatku SP1 i należy go pobrać osobno. Aby uzyskać więcej informacji, odwiedź następujący blog: http://weblogs.asp.net/scottgu/archive/2011/01/03/vs-2010-sp1-beta-and-iis-developer-express.aspx

Po zakończeniu możesz dodać .svgtyp MIME do web.configpliku aplikacji :

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>
Kev
źródło
Wielkie dzięki. W moim przypadku poszło nieco inaczej - aby przejść do IIS (mam ISS, nie ISSExpress) musiałem uruchomić VS w trybie administracyjnym, potem było już wszystko - nie zdefiniowałem svg w web.config, ponieważ zdefiniowałem to już w IIS.
greenoldman
2

Jak wspomniano powyżej, Cassini ignoruje te ustawienia w web.config, więc zamiast tego należy użyć IIS Express (w ustawieniach projektu VS) /programming/5924647/setting-mime-types-using-the-asp- serwer rozwoju sieci

Aby uzyskać więcej informacji na temat konfigurowania typów MIME za pomocą interfejsu użytkownika administratora lub przy użyciu web.config dla IIS lub IIS Express, patrz: http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4- in-iis-for-a-website-or-global / and http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4-to-web-config-in-iis-7 /

George Birbilis
źródło
Czy zadajesz to jako nowe pytanie, czy retorycznie? Jeśli to pierwsze, zadaj nowe pytanie z pełnymi szczegółami. Jeśli to drugie, to prawdopodobnie powinien to być komentarz - w obecnej formie jest to bardzo słaba odpowiedź ( zobacz tutaj, dlaczego )
voretaq7
poprawione z lepszymi linkami
George Birbilis,
o wiele lepiej :-)
voretaq7
2

Użyłem odpowiedzi Kev:

  1. Instalowanie IIS 8.0 Express z instalatora platformy internetowej
  2. Zmienianie właściwości projektu w celu korzystania z IIS Express i tworzenie dla niego katalogu wirtualnego
  3. Dodawanie w konfiguracji web.config → system.webServer
<staticContent>
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>
Wołodymyr Kotylo
źródło
2

Moim obejściem tego problemu było utworzenie własnego httphandlera lokalnie, który zastąpił typ zawartości dla 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();
    }
}

i w web.config dodałem:

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

dzięki temu rozwiązaniu nie musisz używać IIS express, możesz po prostu użyć zwykłego serwera programistycznego w Visual Studio 2010

Robin Karlsson
źródło
1
To dość obrzydliwe, że takie rzeczy muszą się wydarzyć ...
Jarrod Mosen
1

Korzystam z IIS7 i udało mi się to naprawić, klikając prawym przyciskiem myszy serwer w IIS i wybierając właściwości. Następnie kliknąłem przycisk Typy MIME ... Następnie kliknąłem Nowy. Dla rozszerzenia wpisałem .svg. Dla MIME Type I wpisałem image / svg + xml. Następnie zapisałem wszystko i wykonałem polecenie iisreset z wiersza polecenia. Działa świetnie.

Troy Tabor
źródło