Jak zwrócić XML w ASP.NET?

Spotkałem się z wieloma pół-rozwiązaniami zadania zwracania XML w ASP.NET. nie chcę ślepo kopiować i wklejać kodu, który działa przez większość czasu; chcę prawo kod, i chcę wiedzieć dlaczego to prawda. Chcę krytyki; chcę informacji; chcę wiedzy; chcę zrozumienia.

Poniżej znajdują się fragmenty kodu, w kolejności rosnącej złożoności, reprezentujące niektóre z rozwiązań cząstkowych, które widziałem, w tym niektóre z dalszych pytań, które każdy z nich powoduje, I które chciałbym odpowiedzieć tutaj.

Dokładna odpowiedź musi dotyczyć tego, dlaczego my musimy mieć lub nie możemy mieć żadnej z poniższych rzeczy, albo wyjaśnić, dlaczego jest to nieistotne.

  • odpowiedź.Clear ();
  • odpowiedź.ContentType = "text / xml";
  • odpowiedź.ContentEncoding = Kodowanie.UTF8;
  • odpowiedź.ContentEncoding = Kodowanie.UTF16;
  • odpowiedź.ContentType = " text / xml; charset=utf-8";
  • odpowiedź.ContentType = "text / xml; charset = utf-16";
  • odpowiedź.End ()
  • używanie aspx z wyrwanymi wnętrznościami z przodu
  • używanie pliku ashx

W końcu wyobraź sobie, że musisz napisać zawartość funkcji pomocniczej w taki sposób:

///<summary>Use this call inside your (Page_Xxx) method to write the
///xml to the web client. </summary>
///<remarks>See for https://stackoverflow.com/questions/543319/how-to-return-xml-in-asp-net
///for proper usage.</remarks>
public static void ReturnXmlDocumentToWebClient(
    XmlDocument document,
    Page page)
{
   ...
}

Każde rozwiązanie, które widzę, zaczyna się od pobrania pustej strony aspx i przycinania całego HTML z pliku z przodu (co powoduje ostrzeżenia w Visual Studio):

<%@ Page Language="C#"
      AutoEventWireup="true"
      CodeFile="GetTheXml.aspx.cs"
      Inherits="GetTheXml" %>

Następnie używamy zdarzenia Page_Load do zapisu na wyjście:

protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.Write(xml);
}

Czy musimy zmienić ContentType na "text / xml"? I. E.:

protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.ContentType = "text/xml";
   Response.Write(xml);
}

Musimy najpierw zadzwonić?
protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.Clear();
   Response.ContentType = "text/xml";
   Response.Write(xml);
}
Naprawdę musimy to nazywać? Czy Response.Clear nie sprawia, że wcześniejsze upewnienie się, że kod w pliku przednim był pusty (nawet spacja lub powrót karetki) poza <% ... %> jest niepotrzebne?

Robi Response.Clear uczynić go bardziej wytrzymałym, w przypadku, gdy ktoś zostawił pustą linię lub spację w pliku z kodem?

Czy używanie ashx jest tym samym, co pusty plik główny aspx, ponieważ jest zrozumiałe, że nie wyświetla HTML?


Czy musimy zadzwonić Response.End? I. E.:

protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.Clear();
   Response.ContentType = "text/xml";
   Response.Write(xml);
   Response.End();
}

Co jeszcze może się wydarzyć po Response.Write, które wymaga od nas zakończenia odpowiedzi teraz ?


Czy content-type of text/xml jest wystarczający, czy powinien być text / xml; charset = utf-8 ?

protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.Clear();
   Response.ContentType = "text/xml; charset=utf-8";
   Response.Write(xml);
   Response.End();
}

A może konkretnie Nie ? Czy mając charset w typie treści, ale nie ustawiając właściwości, psuje serwer?

Dlaczego nie jakiś inny typ treści, np.:

  • UTF-8
  • utf-16
  • UTF-16

Czy należy podać kod w Response.ContentEncoding?

protected void Page_Load(object sender, EventArgs e)
{
   String xml = "<foo>Hello, world!</foo>";

   Response.Clear();
   Response.ContentType = "text/xml";
   Response.ContentEncoding = Encoding.UTF8;
   Response.Write(xml);
   Response.End();
}

Czy użycie Response.ContentEncoding jest lepsze niż zagłuszanie go w Response.ContentType? Jest gorzej? Czy ten pierwszy jest wspierany? Jest Ostatnie?


Tak naprawdę nie chcę pisać ciągu; chcę napisać XmlDocument. ktoś sugeruje, że mogę użyć XmlWriter:

protected void Page_Load(object sender, EventArgs e)
{
   XmlDocument xml = GetXmlDocumentToShowTheUser();

   Response.Clear();
   Response.ContentType = "text/xml";
   Response.ContentEncoding = Encoding.UTF8;

   using (TextWriter textWriter = new StreamWriter(
         Response.OutputStream,
         Encoding.UTF8))
   {
       XmlTextWriter xmlWriter = new XmlTextWriter(textWriter);
       // Write XML using xmlWriter
       //TODO: How to do this?
   }
}

Zwróć uwagę na użycie Response.OutputStream, a nie Response.Write. To dobrze? Źle? Lepiej? Gorzej? Szybciej? Wolniej? Więcej pamięci? Mniej pamięci?


I przeczytaj że powinieneś renderować

XML w metodzie render() strony aby uniknąć problemów z chunking napotkane, gdy using Page_Load ().

Co to jestchunking ? Jakie są problemy z chunkingiem i w jaki sposób eliminuje je używanie using Page_Render?


Nie chcę zapisywać zawartości mojego obiektu XmlDocument do ciągu znaków, a następnie to zapisywać, ponieważ marnuje to pamięć. Oznacza to, że każdy z nich byłby zły:

Response.Write(doc.ToString());
Response.Write(doc.InnerXml);
xmlWrite.WriteString(doc.ToString());
xmlWrite.WriteString(doc.InnerXml);

Podobne Pytania

Jak zwrócić XML w ASP.NET

Referencje

Jak zwrócić XML z ASPX w ASP.NET 1.1

Zapisanie wyjścia XML do ASP.NET strona www

Jak wyprowadzać XML z ASP.NET

Tworzenie obsługi ASHX w ASP.NET

Author: Ian Boyd, 2009-02-12

9 answers

Znalazłem odpowiedni sposób na zwrócenie XML klientowi w ASP.NET myślę, że jeśli wskażę złe drogi, poprawi to zrozumiałość.

Niepoprawne:

Response.Write(doc.ToString());

Niepoprawne:

Response.Write(doc.InnerXml);

Niepoprawne:

Response.ContentType = "text/xml";
Response.ContentEncoding = System.Text.Encoding.UTF8;
doc.Save(Response.OutputStream);

Poprawny:

Response.ContentType = "text/xml"; //Must be 'text/xml'
Response.ContentEncoding = System.Text.Encoding.UTF8; //We'd like UTF-8
doc.Save(Response.Output); //Save to the text-writer
      //using the encoding of the text-writer
      //(which comes from response.contentEncoding)

Użyj Textwritera

Do Nie użyj Response.OutputStream

Do użyj Response.Output

Oba są strumieniami, ale Output jest TextWriter . Kiedy XmlDocument zapisuje się do TextWriter, użyje kodowania określonego przez tego Textwritera. XmlDocument automatycznie zmieni węzeł deklaracji xml, aby pasował do kodowania używanego przez Textwritera. np. w tym przypadku węzeł deklaracji XML:

<?xml version="1.0" encoding="ISO-8859-1"?>

Stałoby się

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

To dlatego, że TextWriter został ustawiony na UTF-8. (Więcej na ten temat za chwilę). Gdy TextWriter jest zasilany danymi znakowymi, koduje go z sekwencjami bajtowymi odpowiednimi dla jego ustawionego kodowania.

Niepoprawne :

doc.Save(Response.OutputStream);

W tym przykładzie dokument jest nieprawidłowo zapisywany w Strumieniu wyjściowym, który nie zmienia kodowania i może nie pasować do kodowania treści odpowiedzi lub określonego kodowania węzła deklaracji XML.

Poprawne

doc.Save(Response.Output);

Dokument XML jest poprawnie zapisany w obiekcie TextWriter, zapewniając prawidłowe kodowanie.


Zestaw Kodowanie

Kodowanie podane klientowi w nagłówku:

Response.ContentEncoding = ...

Musi pasować do kodowania dokumentu XML:

<?xml version="1.0" encoding="..."?>

Musi pasować do rzeczywistego kodowania obecnego w sekwencjach bajtów wysyłanych do klienta. Aby wszystkie trzy z tych rzeczy się zgadzały, Ustaw pojedynczą linię: {]}

Response.ContentEncoding = System.Text.Encoding.UTF8;

Gdy kodowanie jest ustawione na obiekcie Response , ustawia to samo kodowanie na obiekcie TextWriter . Zestaw kodowania tekstu powoduje, że XmlDocument to zmiana deklaracji XML :

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

Gdy dokument zostanie zapisany:

doc.Save(someTextWriter);

Zapisz na wyjściu odpowiedzi

Nie chcesz zapisywać dokumentu w strumieniu binarnym ani pisać ciągu znaków:

Niepoprawne:

doc.Save(Response.OutputStream);

Tutaj XML jest niepoprawnie zapisywany do strumienia binarnego. Ostateczna Sekwencja kodowania bajtów nie będzie zgodna z deklaracją XML lub odpowiedzią serwera www content-encoding.

Niepoprawne:

Response.Write(doc.ToString());
Response.Write(doc.InnerXml);

Tutaj XML jest niepoprawnie konwertowany na ciąg znaków, który nie ma kodowania. Węzeł deklaracji XML nie jest aktualizowany w celu odzwierciedlenia kodowania odpowiedzi, a odpowiedź nie jest prawidłowo zakodowana, aby pasowała do kodowania odpowiedzi. Ponadto przechowywanie XML w łańcuchu pośrednim marnuje pamięć.

Ty nie chcesz zapisać XML do ciągu znaków, lub wpchać XML do ciągu znaków i response.Write ciąg znaków, ponieważ:

- doesn't follow the encoding specified
- doesn't set the XML declaration node to match
- wastes memory

Do użyj doc.Save(Response.Output);

Do Nie użyj doc.Save(Response.OutputStream);

Do Nie użyj Response.Write(doc.ToString());

Do not use ' Response.Pisz(dok.InnerXml); "


Ustaw typ zawartości

Typ ContentType odpowiedzi musi być ustawiony na "text/xml". Jeśli nie, Klient nie będzie wiedział, że wysyłasz go XML.

Ostatnia Odpowiedź

Response.Clear(); //Optional: if we've sent anything before
Response.ContentType = "text/xml"; //Must be 'text/xml'
Response.ContentEncoding = System.Text.Encoding.UTF8; //We'd like UTF-8
doc.Save(Response.Output); //Save to the text-writer
    //using the encoding of the text-writer
    //(which comes from response.contentEncoding)
Response.End(); //Optional: will end processing

Kompletny Przykład

Rob Kennedy miał rację, że nie udało mi się Dołącz przykład od początku do końca.

Zdobądź informacje.ashx :

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Xml;
using System.IO;
using System.Data.Common;

//Why a "Handler" and not a full ASP.NET form?
//Because many people online critisized my original solution
//that involved the aspx (and cutting out all the HTML in the front file),
//noting the overhead of a full viewstate build-up/tear-down and processing,
//when it's not a web-form at all. (It's a pure processing.)

public class Handler : IHttpHandler
{
   public void ProcessRequest(HttpContext context)
   {
      //GetXmlToShow will look for parameters from the context
      XmlDocument doc = GetXmlToShow(context);

      //Don't forget to set a valid xml type.
      //If you leave the default "text/html", the browser will refuse to display it correctly
      context.Response.ContentType = "text/xml";

      //We'd like UTF-8.
      context.Response.ContentEncoding = System.Text.Encoding.UTF8;
      //context.Response.ContentEncoding = System.Text.Encoding.UnicodeEncoding; //But no reason you couldn't use UTF-16:
      //context.Response.ContentEncoding = System.Text.Encoding.UTF32; //Or UTF-32
      //context.Response.ContentEncoding = new System.Text.Encoding(500); //Or EBCDIC (500 is the code page for IBM EBCDIC International)
      //context.Response.ContentEncoding = System.Text.Encoding.ASCII; //Or ASCII
      //context.Response.ContentEncoding = new System.Text.Encoding(28591); //Or ISO8859-1
      //context.Response.ContentEncoding = new System.Text.Encoding(1252); //Or Windows-1252 (a version of ISO8859-1, but with 18 useful characters where they were empty spaces)

      //Tell the client don't cache it (it's too volatile)
      //Commenting out NoCache allows the browser to cache the results (so they can view the XML source)
      //But leaves the possiblity that the browser might not request a fresh copy
      //context.Response.Cache.SetCacheability(HttpCacheability.NoCache);

      //And now we tell the browser that it expires immediately, and the cached copy you have should be refreshed
      context.Response.Expires = -1;

      context.Response.Cache.SetAllowResponseInBrowserHistory(true); //"works around an Internet&nbsp;Explorer bug"

      doc.Save(context.Response.Output); //doc saves itself to the textwriter, using the encoding of the text-writer (which comes from response.contentEncoding)

      #region Notes
      /*
       * 1. Use Response.Output, and NOT Response.OutputStream.
       *  Both are streams, but Output is a TextWriter.
       *  When an XmlDocument saves itself to a TextWriter, it will use the encoding
       *  specified by the TextWriter. The XmlDocument will automatically change any
       *  XML declaration node, i.e.:
       *     <?xml version="1.0" encoding="ISO-8859-1"?>
       *  to match the encoding used by the Response.Output's encoding setting
       * 2. The Response.Output TextWriter's encoding settings comes from the
       *  Response.ContentEncoding value.
       * 3. Use doc.Save, not Response.Write(doc.ToString()) or Response.Write(doc.InnerXml)
       * 3. You DON'T want to save the XML to a string, or stuff the XML into a string
       *  and response.Write that, because that
       *   - doesn't follow the encoding specified
       *   - wastes memory
       *
       * To sum up: by Saving to a TextWriter: the XML Declaration node, the XML contents,
       * and the HTML Response content-encoding will all match.
       */
      #endregion Notes
   }

   private XmlDocument GetXmlToShow(HttpContext context)
   {
      //Use context.Request to get the account number they want to return
      //GET /GetPatronInformation.ashx?accountNumber=619

      //Or since this is sample code, pull XML out of your rear:
      XmlDocument doc = new XmlDocument();
      doc.LoadXml("<Patron><Name>Rob Kennedy</Name></Patron>");

      return doc;
   }

   public bool IsReusable { get { return false; } }
}
 70
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Najlepiej byłoby użyć ashx do wysłania XML, chociaż zezwalam kodowi w ASPX na przechwycenie normalnego wykonania.

Response.Clear()

Nie używam tego, jeśli nie jesteś pewien, że rzuciłeś coś w odpowiedzi już idź go znaleźć i pozbyć się tego.

Response.ContentType = "text/xml"

Z pewnością zwykły klient nie zaakceptuje zawartości jako XML bez obecności tego typu zawartości.

 Response.Charset = "UTF-8";

Niech Klasa response poprawnie zbuduje nagłówek content type. Używaj UTF-8, chyba że masz naprawdę, naprawdę dobry powód, żeby tego nie robić.

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetAllowResponseInBrowserHistory(true);

Jeśli nie wyślesz nagłówków pamięci podręcznej, niektóre przeglądarki (mianowicie IE) będą buforować odpowiedź, kolejne żądania niekoniecznie będą trafiać na serwer. Musisz również zezwolić Responseinbrowser, jeśli chcesz, aby to działało przez HTTPS (z powodu kolejnego błędu w IE).

Aby wysłać zawartość XmlDocument wystarczy użyć:

dom.Save(Response.OutputStream);

dom.Save(Response.Output);

Po prostu upewnij się, że kodowania pasują, (kolejny dobry powód, aby użyć UTF-8).

Obiekt XmlDocument automatycznie dostosuje swoje wbudowane kodowanie encoding="..." do kodowania Response (np. UTF-8)

Response.End()

Jeśli naprawdę musisz w ASPX, ale jest trochę drastyczny, w ASHX nie rób tego.

 15
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 18:55:02

Poniżej znajduje się przykład poprawnego sposobu myślenia. Przynajmniej tego używam. Musisz odpowiedzieć.Wyczyść, aby pozbyć się nagłówków, które są już wypełnione. Musisz przekazać poprawną Treścityp tekstu / xml. W ten sposób obsługujesz xml. Ogólnie rzecz biorąc, chcesz go podawać jako charset UTF-8, ponieważ tego oczekuje większość parserów. Ale nie sądzę, że to musi być to. Ale jeśli go zmienisz, upewnij się, że zmienisz deklarację dokumentu xml i wskaż tam zestaw znaków. Ty musisz użyć XmlWriter, aby móc pisać w UTF-8, a nie jaki zestaw znaków jest domyślny. I aby poprawnie zakodować dane xml w UTF-8.

   ' -----------------------------------------------------------------------------
   ' OutputDataSetAsXML
   '
   ' Description: outputs the given dataset as xml to the response object
   '
   ' Arguments:
   '    dsSource           - source data set
   '
   ' Dependencies:
   '
   ' History
   ' 2006-05-02 - WSR : created
   '
   Private Sub OutputDataSetAsXML(ByRef dsSource As System.Data.DataSet)

      Dim xmlDoc As System.Xml.XmlDataDocument
      Dim xmlDec As System.Xml.XmlDeclaration
      Dim xmlWriter As System.Xml.XmlWriter

      ' setup response
      Me.Response.Clear()
      Me.Response.ContentType = "text/xml"
      Me.Response.Charset = "utf-8"
      xmlWriter = New System.Xml.XmlTextWriter(Me.Response.OutputStream, System.Text.Encoding.UTF8)

      ' create xml data document with xml declaration
      xmlDoc = New System.Xml.XmlDataDocument(dsSource)
      xmlDoc.DataSet.EnforceConstraints = False
      xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
      xmlDoc.PrependChild(xmlDec)

      ' write xml document to response
      xmlDoc.WriteTo(xmlWriter)
      xmlWriter.Flush()
      xmlWriter.Close()
      Response.End()

   End Sub
   ' -----------------------------------------------------------------------------
 0
Author: Will Rickards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 21:44:47

Wygląda na to, że co najmniej 10 pytań w jednym tutaj, kilka punktów.

Odpowiedź.Wyczyść-to naprawdę zależy od tego, co jeszcze dzieje się w aplikacji-Jeśli masz httpmodules na początku potoku, który może pisać rzeczy, których nie chcesz - usuń to. Przetestuj i przekonaj się. Fiddler lub Wireshark przydatne do tego.

Content Type to text / xml-yup-good idea-przeczytaj na http spec, dlaczego jest to ważne. IMO każdy robiący prace w sieci powinien przeczytać 1.0 i 1.1 spec przynajmniej raz.

Kodowanie - jak jest kodowany xml-jeśli jest to utf-8, to Powiedz TAK, jeśli nie, powiedz coś innego, tylko upewnij się, że wszystkie są zgodne.

Page-osobiście, użyje ashx lub httpmodule, jeśli używasz strony i chcesz ją trochę szybciej, pozbądź się autoeventwireup i ręcznie powiązaj procedury obsługi zdarzeń.

Prawdopodobnie byłoby trochę stratą pamięci, aby najpierw zrzucić xml do ciągu znaków, ale zależy to w dużej mierze od wielkości xml, czy nigdy byś tego nie zauważył.

Jak sugerowali inni, zapisywanie xml do strumienia wyjściowego prawdopodobnie najszybsze, normalnie bym to zrobił, ale jeśli nie jesteś pewien, przetestuj go, nie polegaj na tym, co czytasz na interweb. Nie wierz mi w cokolwiek powiem.

Dla innego podejścia, jeśli xml nie zmienia się tak bardzo, można po prostu zapisać go na dysk i podać plik bezpośrednio, co prawdopodobnie byłoby dość wydajne, ale jak wszystko w programowaniu, to zależy...

 0
Author: seanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 22:18:33

Dziwię się, że nikt nigdy nie wspomniał, że można używać XDocument / XElement, które są dostępne w. NET 4.0 i znacznie ułatwiają wyjście XML.

 0
Author: Peter Bromberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-21 04:16:37

Poniżej znajduje się kod po stronie serwera, który wywoła obsługę i odbiera dane strumienia i ładuje do XML doc

 Stream stream = null;
       **Create a web request with the specified URL**
        WebRequest myWebRequest = WebRequest.Create(@"http://localhost/XMLProvider/XMLProcessorHandler.ashx");
        **Senda a web request and wait for response.**
        WebResponse webResponse = myWebRequest.GetResponse();
        **Get the stream object from response object**
        stream = webResponse.GetResponseStream();

       XmlDocument xmlDoc = new XmlDocument();
      **Load stream data into xml**
       xmlDoc.Load(stream);
 0
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 17:33:32

Poniżej znajduje się sposób, w jaki handler zwróci dane strumienia, które zawierają dane xml po stronie serwera.

Oto kod obsługi, który zwróci dane.

    public void ProcessRequest(HttpContext context)
    {

        StringBuilder xmlBuilder = new StringBuilder();

        xmlBuilder.Append("<Names>");
        xmlBuilder.Append("<Name>");
        xmlBuilder.Append("Sheo");
        xmlBuilder.Append("</Name>");
        xmlBuilder.Append("</Names>");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(Encoding.UTF8.GetBytes(xmlBuilder.ToString()));
        context.Response.End();

    }
 0
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 17:52:55
XmlDocument xd = new XmlDocument();
xd.LoadXml(xmlContent);

context.Response.Clear();
context.Response.ContentType = "text/xml";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
xd.Save(context.Response.Output);
context.Response.Flush();
context.Response.SuppressContent = true;
context.ApplicationInstance.CompleteRequest();
 0
Author: Fernando Meneses Gomes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-25 11:53:56

W zasadzie odpowiedziałeś już na wszystko i na wszystko, więc nie jestem pewien, o co tu chodzi?

FWIW I użyłbym httphandlera - wydaje się, że nie ma sensu wywoływać cyklu życia strony i zajmować się odcinaniem bitów viewstate i sesji i co masz, co nie ma sensu dla dokumentu XML. To jak kupno samochodu i rozebranie go na części do motocykla.

I content-type jest ważne, to jak requesterman wie, co zrobić z odpowiedzią.

 -2
Author: annakata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 21:28:40