在IE中,XML未通过响应对象正确发送到客户端

我有一个上传控件,它从客户端调用一个处理程序,并将一串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字符串是:

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

出于某种原因,XML以完全不同的格式转换为客户端。

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

我在你的代码中看到你使用UTF-8编码将xml作为字符串。 尝试添加以下标头:

  

到您的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/

“已翻译”的XML看起来就像IE在没有XSL样式表的情况下直接加载XML文件时生成的格式化XML视图。 我猜你的上传控件是针对隐藏的iframe ,并使用DOM来加载响应。

根据您使用XML所做的事情,您可以通过强制下载为纯文本来逃避:

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

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

改变以下行

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

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