Wie konfiguriere ich IIS für SVG und Webtests mit Visual Studio?

14

Angenommen, ich habe eine einfache Webseite mit einem SVG-Bild:

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

Wenn ich diese Seite als statische HTML-Seite mache und sie direkt ansehe, wird svg angezeigt. Wenn ich die Adresse dieses SVG eingebe, wird es angezeigt.

Aber wenn ich diese Seite als .aspx-Seite erstelle und sie dynamisch in Visual Studio starte, erhalte ich altText. Wenn ich die Adresse dieses svg (von localhost, nicht als lokale Datei) eingebe, versucht der Browser, es herunterzuladen, anstatt es anzuzeigen.

Ich habe bereits MIME-Typ in IIS definiert (für den gesamten Server - "image / svg + xml") und IIS neu gestartet. Gleicher Effekt wie zuvor.

Frage: Was soll ich mehr tun?

Aktualisieren

WireShark funktioniert nicht (es ist in der Dokumentation), ich habe auch RawCap ausprobiert, aber es kann meine Verbindung nicht nachvollziehen (ungerade), zum Glück hat Fiddler gearbeitet:

Vom Kunden:

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

Antwort vom Server:

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

Hier finden Sie nützliche Fragen und Antworten für Fiddler: /programming/826134/how-to-display-localhost-traffic-in-fiddler-while-debugging-an-asp-net-applicati

Greenoldman
quelle
Denke, du bekommst vielleicht bessere Antworten auf SO. Kurz gesagt, wenn ASPX bereits funktioniert, müssen Sie SVG als MIME-Typ von der ASPX-Seite ausgeben, damit der Browser davon ausgeht, dass es sich um eine SVG-Datei handelt. Vermutlich versuchen Sie, SVG dynamisch von der Seite auszugeben? Wenn ja, AFAIK, wenn es als einzelne Seite funktioniert, funktioniert es in einem IMG-Eintrag.
TristanK
@TristanK, aspx gibt nicht "SVG als MIME-Typ" aus, es enthält einfach <img src...wie oben gezeigt, aspx wird in die vollständige HTML-Seite "übersetzt", aber der gesamte Inhalt (HTML und dann SVG) wird von IIS gesendet.
Greenoldman
Ich verstehe immer noch nicht, was Sie beschreiben, aber ich denke, dies ist eine Entwicklungsfrage, die Sie besser auf StackOverflow stellen sollten.
TristanK
2
Holen Sie sich eine Kopie von Fiddler und verfolgen Sie die beiden verschiedenen Anforderungen. Das kann Ihnen Hinweise geben, warum sich eine direkte Anfrage nach dem Bild in jedem dieser Fälle anders verhält. Die Hinweise finden sich höchstwahrscheinlich in den zurückgegebenen Headern. Ohne diese Daten können wir nur raten, welche Antworten Ihr Server zurückgibt.
Kev
@macias Wie Kev bereits sagte, müssen Sie den Datenverkehr nachverfolgen. Geiger oder einfacher alter Wireshark sollten es aufnehmen können.
Chris S

Antworten:

14

Aus Ihrer Fiddler-Ablaufverfolgung geht hervor, dass Sie Ihre Seiten mithilfe des integrierten Visual Studio-Webservers bereitstellen:

Server: ASP.NET Development Server/10.0.0.0

Wenn dies von IIS7 bereitgestellt würde, würden wir sehen:

Server: Microsoft-IIS/7.5

Der integrierte Visual Studio-Webserver verfügt nur über eine begrenzte Anzahl von MIME-Typen, die bereitgestellt werden können, und hat keine Kenntnis der MIME-Typen, die Sie für IIS7 festgelegt haben. Ich habe vor einiger Zeit eine Antwort auf ein ähnliches Problem bei Stack Overflow geschrieben:

Festlegen von MIME-Typen mithilfe von ASP.NET Development Server

Der eingebaute Server dient Ihrer .svgDatei als:

Content-Type: application/octet-stream

Dies ist wahrscheinlich der Grund, warum der Browser zum Herunterladen auffordert.

Überprüfen Sie in Visual Studio, ob Sie IIS Express verwenden, indem Sie die Projekteigenschaften Ihrer Site öffnen und in der Liste der vertikalen Registerkarten die Registerkarte "Web" auswählen:

Bildbeschreibung hier eingeben

Wenn Sie IIS 7.5 Express nicht installiert haben, können Sie es hier herunterladen:

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

Sie benötigen Visual Studio 2010 Service Pack 1, um alle Vorteile nutzen zu können:

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

IIS Express-Unterstützung

Mit Visual Studio 2010 SP1 können Sie Internet Information Services (IIS) 7.5 Express als lokalen Hostserver für die Website und Webanwendungsprojekte verwenden.

Hinweis: IIS 7.5 Express ist nicht in SP1 enthalten und muss separat heruntergeladen werden. Weitere Informationen finden Sie in folgendem Blog: http://weblogs.asp.net/scottgu/archive/2011/01/03/vs-2010-sp1-beta-and-iis-developer-express.aspx

Wenn Sie dies getan haben, können Sie den .svgMIME-Typ zur web.configDatei Ihrer Anwendung hinzufügen :

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>
Kev
quelle
Danke vielmals. In meinem Fall ging es etwas anders - um zu IIS zu wechseln (ich habe ISS, nicht ISSExpress), musste ich VS im Admin-Modus ausführen, danach war alles - ich habe svg in web.config nicht definiert, weil ich es definiert habe es bereits in IIS.
Greenoldman
2

Wie oben erwähnt, ignoriert Cassini diese Einstellungen in web.config, sodass stattdessen IIS Express verwendet werden muss (in den VS-Projekteinstellungen). Https://stackoverflow.com/questions/5924647/setting-mime-types-using-the-asp- Net-Development-Server

Weitere Informationen zum Konfigurieren von MIME-Typen über die Administratoroberfläche oder über web.config für IIS oder IIS Express finden Sie unter: http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4- in-iis-for-a-website-or-global / und http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4-to-web-config-in-iis-7 /

George Birbilis
quelle
Stellen Sie dies als neue Frage oder rhetorisch? Wenn dies der Fall ist, stellen Sie bitte eine neue Frage mit allen Details. Wenn letzteres der Fall ist, sollte dies wahrscheinlich ein Kommentar sein - so wie es
aussieht, ist
Überarbeitet mit besseren Links
George Birbilis
viel besser :-)
voretaq7
2

Ich habe Kev Antwort verwendet, von:

  1. Installieren von IIS 8.0 Express über das Web Platform-Installationsprogramm
  2. Ändern der Projekteigenschaften für die Verwendung von IIS Express und Erstellen eines virtuellen Verzeichnisses
  3. Hinzufügen in der Konfiguration von web.config → system.webServer
<staticContent>
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>
Volodymyr Kotylo
quelle
2

Meine Problemumgehung bestand darin, einen eigenen lokalen httphandler zu erstellen, der den Inhaltstyp für svg überschrieb.

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();
    }
}

und in der web.config habe ich hinzugefügt:

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

Mit dieser Lösung müssen Sie nicht IIS Express verwenden, sondern können einfach den regulären Entwicklungsserver in Visual Studio 2010 verwenden

Robin Karlsson
quelle
1
Es ist ziemlich schlimm, dass so etwas passieren muss ...
Jarrod Mosen
1

Ich verwende IIS7 und konnte dies beheben, indem ich mit der rechten Maustaste auf den Server in IIS klickte und Eigenschaften auswählte. Dann habe ich auf die Schaltfläche MIME Types ... geklickt. Ich habe dann auf Neu geklickt. Für die Erweiterung habe ich .svg eingegeben. Für den MIME-Typ habe ich image / svg + xml eingegeben. Ich habe dann alles gespeichert und an der Eingabeaufforderung ein iisreset durchgeführt. Hat super funktioniert.

Troy Tabor
quelle