2017-01-13 2 views
-1

Я пишу XML-данные в браузер пользователя для загрузки. Ниже приведен кодНаписание XML-файла для пользователей Браузер и загрузка

защищен недействительным WriteXmlToPageDownload (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 содержит XML, созданный XElement (бизнес-логика ...) Ниже образец XML требуется

<?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.And получает исключение «Невозможно оценить выражение, потому что код оптимизирован или собственный кадр находится поверх стека вызовов».

Мое требование - загрузить XML-файл в браузер пользователя. Пожалуйста, дайте мне знать, какую ошибку я делаю или лучший способ этого.

Заранее спасибо.

ответ

1

После того, как вы загрузили данные XML в XDocument то код

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

Может быть заменен

x.Save(context.Response.OutputStream); 

Быстрая макетом подобного кода, приведенный ниже код будет скачать xml после того, как пользователю предлагается сохранить или открыть вложение. Код содержится в файле ashx Http Handler.

/// <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 непосредственно на веб-странице. Код содержится в файле ashx Http Handler.

/// <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; 
     } 
    } 
} 
Смежные вопросы