2012-12-28 2 views
6

클라이언트로부터 처리기를 호출하고 xml 문자열을 클라이언트에 다시 보내는 업로드 컨트롤이 있습니다. 아래의 코드는 크롬에서 잘 작동하지만 이상한 XML을 클라이언트의 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 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 문자열로 전송 핸들러에서 디버깅하는 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이 완전히 다른 형식으로 클라이언트로 변환되는 몇 가지 이유가 있습니다.

+0

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

당신은 IE의 다른 버전을 시도 했습니까? 다른 컴퓨터에서도? 나는이 코드를 가져 왔고 IE9는 코드에 맞는 XML을 보여주고있다. 방금 파일 대신 문자열 (스트림으로 변환하여 바이트 [] 배열로 변환)을 사용하도록 변경했습니다. 나는 그것이 인코딩 문제일지도 모른다고 생각하고 있었지만 여전히있을 수 있습니다 - 파일 업로드를 시도 할 것입니다. –

+0

이 예제에서 업로드중인 실제 페이로드 소스 파일을 게시 할 수 있습니까? 이 오류를 재현 할 수 없습니다 - 인코딩 때문에 doc.LoadXml에서 오류가 발생하거나 XmlDocument.Load (uploadInfo.InputStream)를 직접 사용하도록 코드를 변경하면 IE9 및 Chrome에서 작동합니다. 원본 파일을 게시 할 수 있다면 그것을보고 오류를 재현하여 수정 사항을 찾을 수 있는지 확인하십시오. –

+0

IE8에서 위의 XML이 원래 파일 인 것입니다. –

답변

2

인코딩과 관련이 있다는 이상한 느낌이 들었습니다. IE에서 한 번 비슷한 문제가있었습니다.

xml을 문자열로 가져 오기 위해 UTF-8 인코딩을 사용하고 있습니다. 다음 헤더를 추가하십시오.

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

XML 파일에 추가하십시오. 나는 당신이 그것을 남겨두면 자동으로 감지되지만 이것을 시도하고 메모장 + +와 같은 파일을 열고 UTF-8 인코딩으로 저장하려고 시도한다는 것을 알고 있습니다. 또한 파일이 실용적으로 생성 된 경우 코드를 확인하고 UTF-8 인코딩을 강제 실행하십시오.

웹 응용 프로그램에 대한 경험으로, IE가 가장 많이 꼽히는 곳은 Chrome, Firefox, Opera, Safari 등과 다른 몇 가지 기본값이있는 곳입니다.이 값을 명시 적으로 입력하지 않으면, 브라우저는 기본값을 설정하지만 코드에 코드를 입력하면 특정 동작이 강제 적용됩니다. 이것은 Chrome, Mozilla 등에서는 필요하지 않지만 IE의 해석을 "고칠"것입니다. 위에서 언급 한 기본 값의

하나는 직접 XSL 스타일 시트없이 XML 파일을로드 할 때 IE가 생성하는 "번역"XML은 형식의 XML 뷰처럼 보이는 인코딩 http://social.technet.microsoft.com/Forums/en-US/winserverGP/thread/2f5cdeff-3723-43bf-a880-d4a41222e24d/

0

입니다. 귀하의 업로드 컨트롤이 숨겨진 iframe을 타겟팅하고 DOM을 사용하여 응답을로드하고있는 것으로 추측됩니다.

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

당신은 prevent IE8 from trying to guess the content typeX-Content-Type-Options: nosniff 헤더를 추가해야합니다 : 당신은 XML과 무슨 일을하는지에 따라

, 당신은 일반 텍스트로 다운로드를 강제로 도망 할 수있을 것 .

0

변경 라인에 따라

context.Response.ContentType = "text/xml"; 
관련 문제