将svg嵌入aspx.net不适用于IIS 7.5

时间:2019-01-15 17:33:37

标签: asp.net iis svg

我有一个网站,直到最近才通过aspx将png图像嵌入另一个aspx中,生成的html代码如下所示:

   <div class="widgetcontent" style="padding: 0px; margin: 0px; padding-left: 5px;">
     <div id="ctl00_CPHMaster_UPRanges">
         <img id="ctl00_CPHMaster_IMRanges" src="range.aspx" style="height:280px;width:460px;border-width:0px;" />
     </div>
   </div>

range.aspx仅提供了动态创建的png图像。

我现在更改了range.aspx,以便它提供一个svg并更改了嵌入页面,以使生成的html代码现在看起来像这样:

  <div class="widgetcontent" style="padding: 0px; margin: 0px; padding-left: 5px;">
    <div id="ctl00_CPHMaster_UPRanges">
        <img id="ctl00_CPHMaster_IMRanges" type="image/svg+xml" src="range.aspx" style="height:280px;width:460px;border-width:0px;" /> 
    </div>
  </div>

但是,这行不通。这些是事实:

a)它可以在由Visual Studio 2012创建的ASP.NET开发服务器上的Windows开发人员机器上正常工作。

b)它可以在运行IIS 8.5的测试计算机上正常工作。

c)它在运行IIS 7.5的生产计算机上不起作用。

d)“它不起作用”的意思是:应该显示嵌入式svg的页面只是显示了损坏的图像符号。

e)但是,当我右键单击损坏的图像符号并选择“查看图像”时,将显示svg!

f)当我右键单击唯一的svg并选择“查看页面源代码”时,它显示的是纯svg文本,周围没有html。

g)在网络写入中必须在IIS 7.5配置中启用svg的某些位置。我已经做到了。它仍然不起作用。

h)这不是浏览器问题,我已经使用Chrome,IE,Firefox和其他工具进行了检查。

任何帮助表示赞赏。

更新1:因为Brando Zhang询问了range.aspx代码,原则上看起来像这样:

<%@ Import Namespace="WVA.Client.Web" %>

<%@ Page Language="c#" AutoEventWireup="true" Culture="en-Us" UICulture="auto" %>

<%@ Import Namespace="WVA.ServiceAccessLayer.WebService" %>
<%@ Import Namespace="WVA.SharedBusinessLogic" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
<html>
<head>

    <script runat="server" language="C#">           

        protected void Page_Load(object sender, EventArgs e)
        {

            Response.Clear();           

            byte[] imageByteData = funcGetImage(bildformat);
            if (format == Format.Svg)
            {
                Response.ContentType = "image/svg+xml";
                Response.Flush();
                string imageTextUtf8 = Encoding.UTF8.GetString(imageByteData, 0, imageByteData.Length);
                Response.Write(imageTextUtf8);
            }
            else if (format == Format.Png)
            {
                Response.ContentType = "image/png";
                Response.Flush();
                Response.BinaryWrite(imageByteData);
            }

            Response.End();
        }

    </script>

</head>
</html>

更新2:由于Hackerman的提示,我试图将其添加到web.config:

    <staticContent>
        <remove fileExtension=".svg" />
        <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    </staticContent>

这并没有使嵌入式图像变得更好。但是它产生了有趣的效果,随后在Chrome和Opera中,“在单独的选项卡中查看图像”不再显示svg图像,而是显示svg文本。 Firefox仍显示该图像。

更新3: 根据Lex Li的提示,我们已使用Chrome的开发人员工具进行了检查。在那里找不到任何错误。但是有趣的是: 没关系的地方,响应标头包含以下行 内容类型:image / svg + xml 。在IIS 7.5不能正常运行的情况下,响应标头中没有 Content-Type:

1 个答案:

答案 0 :(得分:0)

我们已经找到解决问题的方法。 最初,我们使用以下代码来创建图像:

            Response.ContentType = "image/svg+xml";
            Response.Flush();
            string imageTextUtf8 = Encoding.UTF8.GetString(imageByteData, 0, imageByteData.Length);
            Response.Write(imageTextUtf8);

这不适用于IIS 7.5, Response.Flush()似乎删除了IIS 7.5中的Content-Type。 (但不在IIS 10或ASP.NET Development Server 11中。)

使用以下代码,不会删除Content-Type,并且一切正常。

            Response.ContentType = "image/svg+xml";
            string imageTextUtf8 = Encoding.UTF8.GetString(imageByteData, 0, imageByteData.Length);
            Response.Write(imageTextUtf8);
            Response.Flush();