2012-12-28 11 views
6

Ho un controllo di caricamento che chiama un gestore dal client e deve inviare una stringa di xml al client. Il codice qui sotto funziona bene in chrome, ma sta inviando il misterioso xml al client in IE.XML non inviato al client tramite oggetto di risposta correttamente in IE

Codice Handler:

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); 
    }   
} 

La stringa XML debug dal gestore prima inviata al cliente (che è corretto)

<?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> 

Poi stringa XML che viene inviato indietro è:

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

Per qualche motivo, l'XML viene tradotto nel client in un formato completamente diverso.

+0

Hai provato diverse versioni di IE? Anche su macchine diverse? Ho tirato questo codice e IE9 sta mostrando XML corretto per me con il tuo codice. L'ho appena modificato per usare una stringa (in un flusso e convertita in un array [byte]] invece di un file. Stavo pensando che potrebbe essere un problema di codifica, potrebbe ancora essere - proverò con un caricamento di file. –

+0

Puoi pubblicare il vero file sorgente di payload che stai caricando in questo esempio? Non riesco a riprodurre questo errore: o ottengo un errore su doc.LoadXml a causa della codifica, oppure se cambio codice per utilizzare direttamente XmlDocument.Load (uploadInfo.InputStream), funziona in IE9 e Chrome; Se puoi pubblicare il file originale, posso guardarlo e vedere se riesco a riprodurre il tuo errore e provare a trovare una soluzione. –

+0

Sto lavorando con IE8, l'xml sopra è il file originale –

risposta

2

Ho la strana sensazione che questo abbia a che fare con la codifica, ho avuto un problema simile una volta con IE.

Vedo nel codice che si utilizza la codifica UTF-8 per ottenere xml come stringa. Provare ad aggiungere la seguente intestazione:

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

al file XML. So che se lo lasci fuori viene rilevato automaticamente, ma prova a farlo e prova anche ad aprire il tuo file con qualcosa come Notepad ++ e salvare nella codifica UTF-8. Inoltre, se il file viene generato in modo pragmatico, controlla il codice e prova a forzare la codifica UTF-8.

Nella mia esperienza con le applicazioni Web, il punto in cui IE fa schifo (la maggior parte) è dove ci sono alcuni valori predefiniti diversi da Chrome, Firefox, Opera, Safari, ecc. Se non si immettono questi valori in modo esplicito, il browser imposterà i valori predefiniti, ma se li inserisci nel codice, forzerai un determinato comportamento. Questo non è richiesto per Chrome, Mozilla, ecc. Ma "correggerà" l'interpretazione di IE.

Uno dei valori di default di cui sopra è la codifica http://social.technet.microsoft.com/Forums/en-US/winserverGP/thread/2f5cdeff-3723-43bf-a880-d4a41222e24d/

0

L'XML "tradotto" si presenta come la vista in formato XML che IE genera quando si carica direttamente un file XML, senza un foglio di stile XSL. Immagino che il tuo controllo caricamento abbia come target uno iframe nascosto e che utilizzi il DOM per caricare la risposta.

A seconda di quello che stai facendo con l'XML, si potrebbe essere in grado di farla franca con costringendolo a scaricare come testo semplice:

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

Avrai bisogno di aggiungere l'intestazione X-Content-Type-Options: nosniff a prevent IE8 from trying to guess the content type .

0

Change Seguendo la linea

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

con

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