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の解釈を「修正」します。

上記のデフォルト値の1つは、エンコーディング http://social.technet.microsoft.com/Forums/en-US/winserverGP/thread/2f5cdeff-3723-43bf-a880-d4a41222e24d/です。

于 2013-03-11T09:21:15.523 に答える
0

次の行を変更

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

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

「変換された」XML は、XSL スタイルシートを使用せずに XML ファイルを直接ロードしたときに IE が生成する、フォーマットされた XML ビューのように見えます。あなたのアップロード コントロールは hidden をターゲットにしiframeており、DOM を使用して応答をロードしていると思います。

XML で何をしているかによっては、強制的にプレーンテキストとしてダウンロードすることを回避できる場合があります。

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

IE8 がコンテンツ タイプを推測しようとするのを防ぐためX-Content-Type-Options: nosniffに、ヘッダーを追加する必要があります。

于 2013-03-13T11:52:35.697 に答える