2017-01-13 9 views
-1

XML 데이터를 사용자 브라우저에 다운로드하여 다운로드하고 있습니다. 다음은 코드입니다XML 파일을 사용자 브라우저에 쓰고 다운로드

(XElement를 XmlCustomerData) 는 {

 try 
     { 
      if (XmlCustomerData != null) 
      { 

       XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(XmlCustomerData)); 
       StringBuilder builder = new StringBuilder(); 
       StringWriter writer = new StringWriter(builder); 

       x.Save(writer); 
       writer.Flush(); 
       HttpContext context = HttpContext.Current; 
       context.Response.Write(builder.ToString().Replace("encoding=\"utf-16\"", "encoding=\"utf-8\"")); 
       context.Response.ContentType = "application/xml"; 
       string filename = "CustomerDetails "; 
       context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + ".xml"); 
       context.Response.AppendHeader("Connection", "close"); 
       context.Response.End(); 

      } 

     } 
     catch (Exception ex) 
     { 
      Log("Exception in CustomerData" + ex.Message.ToString(), this); 
     } 
    } 

XmlCustomerData이 XElement를 (일부 비즈니스 로직 ...)에 의해 생성 된 XML을 포함 아래는 XML의 샘플

을 필요로 보호 무효 WriteXmlToPageDownload
<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Customers> 
    <Customer> 

<deatils name="ABC"> 
    <id="1"> 
    </details> 
<deatils name="XYZ"> 
    <id="2"> 
</details> 
    ... 
</Customer> 
</Customers> 

과 XmlCustomerData이 완료 개최 비즈니스 로직을 포함

<Customers>...</Customers> 

문제는. 1.XML이 생성되고 사용자 브라우저에 다운로드되지 않습니다. 2. 예외가 발생했습니다. "코드가 최적화되었거나 기본 프레임이 호출 스택 위에 있기 때문에 표현식을 평가할 수 없습니다."

내 요구 사항은 사용자의 브라우저에 XML 파일을 다운로드하는 것입니다. 내가하고있는 실수 나 더 좋은 방법을 알려주세요.

미리 감사드립니다.

답변

1

그런 다음 코드

StringBuilder builder = new StringBuilder(); 
StringWriter writer = new StringWriter(builder); 

x.Save(context.Response.OutputStream); 

비슷한 코드의 빠른 모형으로 대체 할 수 XDocument에 XML 데이터를로드 한 후, 코드는 아래를 다운로드합니다 사용자가 첨부 파일을 저장하거나 열 것을 요청한 후 xml 내용 이 코드는 HTTP 처리기 ashx 파일에 포함되어 있습니다.

/// <summary> 
/// Summary description for Handler1 
/// </summary> 
public class Handler1 : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     string xml = 
      @"<?xml version=""1.0""?> 
      <Customers> 
       <Customer> 
        <details> 
         <id/> 
        </details> 
        <details> 
         <id/> 
        </details> 
       </Customer> 
      </Customers>"; 

     XElement xel = XElement.Parse(xml); 
     XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(xel)); 

     context.Response.ContentType = "application/xml"; 
     context.Response.AppendHeader("Content-Disposition", "attachment; filename=Test.xml"); 
     context.Response.AddHeader("Content-Length", xml.Length.ToString()); 
     x.Save(context.Response.OutputStream); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

이 코드는 xml을 웹 페이지에 직접 표시합니다. 이 코드는 HTTP 처리기 ashx 파일에 포함되어 있습니다.

/// <summary> 
/// Summary description for Handler2 
/// </summary> 
public class Handler2 : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     string xml = 
      @"<?xml version=""1.0""?> 
      <Customers> 
       <Customer> 
        <details> 
         <id/> 
        </details> 
        <details> 
         <id/> 
        </details> 
       </Customer> 
      </Customers>"; 

     XElement xel = XElement.Parse(xml); 
     XDocument x = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement(xel)); 

     context.Response.ContentType = "application/xml"; 
     context.Response.AddHeader("Content-Length", xml.Length.ToString()); 
     x.Save(context.Response.OutputStream); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
}