¿Cómo configurar IIS para SVG y pruebas web con Visual Studio?

14

Digamos que tengo una página web simple con una imagen svg:

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

Si hago esta página como página estática html y la veo directamente, se muestra svg. Si escribo la dirección de este svg, se muestra.

Pero cuando hago esto como página .aspx y lo ejecuto dinámicamente desde Visual Studio, recibo alttexto. Si escribo la dirección de este svg (desde localhost, no como un archivo local), el navegador intenta descargarlo en lugar de mostrarlo.

Ya definí el tipo mime en IIS (para todo el servidor - "image / svg + xml") y reinicié IIS. Mismo efecto que antes.

Pregunta: ¿qué debo hacer más?

Actualizar

WireShark no funcionará (está en la documentación), probé también RawCap, pero no puede rastrear mi conexión (impar), afortunadamente Fiddler funcionó:

Del cliente:

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

Respuesta del servidor:

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

Para el registro, aquí hay preguntas y respuestas útiles para Fiddler: /programming/826134/how-to-display-localhost-traffic-in-fiddler-while-debugging-an-asp-net-applicati

Greenoldman
fuente
Cree que podría obtener mejores respuestas para esto en SO. En resumen, suponiendo que ASPX ya esté funcionando, necesitaría emitir SVG como tipo MIME desde la página ASPX para que el navegador crea que es un archivo SVG. ¿Está, presumiblemente, tratando de emitir dinámicamente SVG desde la página? Si es así, AFAIK si funciona como una sola página, funcionará en una entrada IMG.
TristanK
@TristanK, aspx no emite "SVG como tipo MIME", simplemente contiene lo <img src...que se muestra arriba, aspx se "traduce" a la página html completa, pero IIS realiza el envío de todo el contenido (html y luego svg).
greenoldman
Todavía no entiendo lo que está describiendo, pero creo que esta es una pregunta de desarrollo, por lo que sería mejor preguntar en StackOverflow.
TristanK
2
Tome una copia de Fiddler y luego rastree las dos solicitudes diferentes. Eso podría darle algunas pistas de por qué una solicitud directa de la imagen se comporta de manera diferente en cada uno de estos casos. Las pistas probablemente estarán en los encabezados devueltos. Sin estos datos, todo lo que podemos hacer es adivinar qué respuestas está devolviendo su servidor.
Kev
@macias Como dijo Kev, tendrás que rastrear el tráfico. Fiddler o el viejo Wireshark deberían poder recogerlo.
Chris S

Respuestas:

14

De su seguimiento de Fiddler parece que está sirviendo sus páginas usando el servidor web incorporado de Visual Studio:

Server: ASP.NET Development Server/10.0.0.0

Si esto estuviera siendo atendido por IIS7, veríamos:

Server: Microsoft-IIS/7.5

El servidor web incorporado de Visual Studio solo tiene un conjunto limitado de tipos MIME que puede servir y no tiene conocimiento de los tipos MIME que configura para IIS7. Escribí una respuesta a un problema similar en Stack Overflow hace un tiempo:

Establecer tipos MIME utilizando el servidor de desarrollo ASP.NET

El servidor incorporado sirve su .svgarchivo como:

Content-Type: application/octet-stream

Esto es probablemente lo que está causando que el navegador solicite la descarga.

En Visual Studio, compruebe que está utilizando IIS Express abriendo las propiedades del proyecto de su sitio y seleccionando la pestaña "Web" de la lista de pestañas verticales:

ingrese la descripción de la imagen aquí

Si no tiene instalado IIS 7.5 Express, puede obtenerlo desde aquí:

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

Necesitará Visual Studio 2010 Service Pack 1 para aprovechar al máximo:

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

Soporte de IIS Express

Visual Studio 2010 SP1 le permite utilizar Internet Information Services (IIS) 7.5 Express como el servidor de alojamiento local para el sitio web y los proyectos de aplicaciones web.

Nota: IIS 7.5 Express no está incluido en SP1 y debe descargarlo por separado. Para obtener más información, visite el siguiente blog: http://weblogs.asp.net/scottgu/archive/2011/01/03/vs-2010-sp1-beta-and-iis-developer-express.aspx

Cuando lo haya hecho, puede agregar el .svgtipo mime al web.configarchivo de su aplicación :

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>
Kev
fuente
Muchas gracias. En mi caso, fue algo diferente: para cambiar a IIS (tengo ISS, no ISSExpress) tuve que ejecutar VS en modo administrador, después de eso fue todo: no definí svg en web.config porque definí ya está en IIS.
greenoldman
2

Como se mencionó anteriormente, Cassini ignora esta configuración en web.config, por lo que uno debe usar IIS Express en su lugar (en la configuración del proyecto VS) /programming/5924647/setting-mime-types-using-the-asp- servidor de desarrollo de red

Para obtener más información sobre cómo configurar los tipos MIME usando la interfaz de usuario de administración o usando web.config para IIS o IIS Express, consulte: http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4- in-iis-for-a-website-or-global / y http://4rapiddev.com/tips-and-tricks/add-mime-type-flv-mp4-to-web-config-in-iis-7 / /

George Birbilis
fuente
¿Estás haciendo esto como una nueva pregunta, o retóricamente? Si es lo primero, haga una nueva pregunta con todos los detalles. Si es lo último, esto probablemente debería ser un comentario, ya que es una respuesta muy pobre ( vea aquí por qué )
voretaq7
revisado con mejores enlaces
George Birbilis
mucho mejor :-)
voretaq7
2

He usado la respuesta de Kev, por:

  1. Instalación de IIS 8.0 Express desde el Instalador de plataforma web
  2. Cambiar las propiedades del proyecto para usar IIS Express y crear un Directorio virtual para él
  3. Agregar en la configuración de web.config → system.webServer
<staticContent>
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>
Volodymyr Kotylo
fuente
2

Mi solución para esto fue crear mi propio httphandler localmente que sobrescribió el tipo de contenido para 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();
    }
}

y en web.config agregué:

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

con esta solución no tiene que usar IIS express, solo puede usar el servidor de desarrollo regular en Visual Studio 2010

Robin Karlsson
fuente
1
Es bastante asqueroso que este tipo de cosas tenga que suceder ...
Jarrod Mosen
1

Estoy ejecutando IIS7, y pude solucionar esto haciendo clic derecho en el servidor en IIS y seleccionando propiedades. Luego hice clic en el botón Tipos MIME ... Luego hice clic en Nuevo. Para la extensión, escribí .svg. Para el tipo MIME, escribí image / svg + xml. Luego guardé todo e hice un iisreset desde el símbolo del sistema. Funcionó muy bien.

Troy Tabor
fuente