6

我有一个上传控件,它从客户端调用处理程序,并将一串 xml 发送回客户端。下面的代码在 chrome 中运行良好,但在 IE 中将奇怪的 xml 发送回客户端。

处理程序代码:

public void ProcessRequest(HttpContext context)
{
    if (context.Request.Files.Count > 0)
    {
        var uploadInfo = context.Request.Files[0];
        var uploadStream = uploadInfo.InputStream;
        var upload = new byte[uploadInfo.ContentLength];
        uploadStream.Read(upload, 0, uploadInfo.ContentLength);
        var payload = System.Text.Encoding.UTF8.GetString(upload);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(payload);
        context.Response.ContentType = "application/xml";
        context.Response.Write(doc.OuterXml);

        //context.Response.Write(payload);
    }        
}

在发送到客户端之前从处理程序调试的 XML 字符串(看起来正确)

<?xml version="1.0"?>  
 <ApplicationData>
 <DataElement name="Comments" type="String"></DataElement> 
 <DataElement name="ModAuthor" type="String"></DataElement>  
 <DataElement name="CreateDate" type="Datetime"></DataElement>    
 <DataElement name="Author" type="String"></DataElement>   
 <DataElement name="StatusDate" type="Datetime"></DataElement>  
 <DataElement name="StatusDisp" type="String"></DataElement>   
 <DataElement name="Status" type="Number"></DataElement>   
 <DataElement name="Approved" type="Number"></DataElement> 
 <DataElement name="Submitted" type="Number"></DataElement>  
 <DataElement name="LogNumber" type="Number"></DataElement>  
 </ApplicationData>

那么被发回的 XML 字符串是:

<DIV class=e><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;?</SPAN><SPAN class=pi>xml version="1.0" </SPAN><SPAN class=m>?&gt;</SPAN> </DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em" class=c><A class=b onfocus=h() onclick="return false" href="#">-</A> <SPAN class=m>&lt;</SPAN><SPAN class=t>ApplicationData</SPAN><SPAN class=m>&gt;</SPAN></DIV>
<DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>Comments</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>String</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>ModAuthor</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>String</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>CreateDate</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>Datetime</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>Author</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>String</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>StatusDate</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>Datetime</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>StatusDisp</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>String</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>Status</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>Number</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>Approved</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>Number</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV class=e>
<DIV style="TEXT-INDENT: -2em; MARGIN-LEFT: 1em"><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;</SPAN><SPAN class=t>DataElement</SPAN> <SPAN class=t>name</SPAN><SPAN class=m>="</SPAN><B>Submitted</B><SPAN class=m>"</SPAN><SPAN class=t> type</SPAN><SPAN class=m>="</SPAN><B>Number</B><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN> </DIV></DIV>
<DIV><SPAN class=b>&nbsp;</SPAN> <SPAN class=m>&lt;/</SPAN><SPAN class=t>ApplicationData</SPAN><SPAN class=m>&gt;</SPAN></DIV></DIV></DIV>

由于某种原因,XML 正在以完全不同的格式翻译给客户端。

4

3 回答 3

2

我有一种奇怪的感觉,这与编码有关,我曾经在 IE 上遇到过类似的问题。

我在您的代码中看到您使用 UTF-8 编码来获取 xml 作为字符串。尝试添加以下标题:

<?xml version="1.0" encoding="UTF-8"?>

到您的 XML 文件。我知道如果你把它排除在外,它会被自动检测到,但试着这样做,并尝试用 Notepad++ 之类的东西打开你的文件并保存为 UTF-8 编码。此外,如果文件是实际生成的,请检查代码并尝试强制使用 UTF-8 编码。

以我对 Web 应用程序的经验来看,IE 出错的地方(最多)是有一些与 Chrome、Firefox、Opera、Safari 等不同的默认值。如果你没有明确输入这些值,浏览器会设置这是默认值,但如果您在代码中输入它们,您将强制执行某种行为。这对于 Chrome、Mozilla 等不是必需的,但会“修复”IE 的解释。

上述默认值之一是编码 http://social.technet.microsoft.com/Forums/en-US/winserverGP/thread/2f5cdeff-3723-43bf-a880-d4a41222e24d/

于 2013-03-11T09:21:15.523 回答
0

“翻译”的 XML 看起来像 IE 在您直接加载没有 XSL 样式表的 XML 文件时生成的格式化 XML 视图。我猜您的上传控件的目标是 hidden iframe,并使用 DOM 加载响应。

根据您对 XML 所做的操作,您可能能够避免强制它以纯文本格式下载:

context.Response.ContentType = "text/plain";
context.Response.AppendHeader("X-Content-Type-Options", "nosniff");

您需要添加X-Content-Type-Options: nosniff标头以防止 IE8 尝试猜测内容类型

于 2013-03-13T11:52:35.697 回答
0

更改以下行

context.Response.ContentType = "application/xml"; 

context.Response.ContentType = "text/xml";
于 2013-03-13T16:31:22.560 回答