source

ASP.NET에서 XML을 반환하는 방법은 무엇입니까?

ittop 2023. 6. 26. 23:10
반응형

ASP.NET에서 XML을 반환하는 방법은 무엇입니까?

ASP.NET에서 XML을 반환하는 작업에 대한 많은 해결책을 접했습니다.하지만 대부분의 경우 작동하는 코드를 맹목적으로 복사하여 붙여넣고 싶지는 않습니다. 올바른 코드를 원하며 올바른 이유를 알고 싶습니다.저는 비판, 정보, 지식, 이해를 원합니다.

아래에는 코드 조각들이 있습니다. 복잡성이 증가하는 순서대로, 제가 본 부분적인 해결책들 중 일부를 나타냅니다. 각각의 해결책들이 야기하는 추가적인 질문들을 포함합니다. 그리고 여기서 제가 대답하고 싶은 것들입니다.

철저한 답변은 왜 우리가 다음과 같은 것들을 가지고 있거나 가지고 있지 않아야 하는지를 다루어야 합니다. 그렇지 않으면 왜 그것이 관련이 없는지를 설명해야 합니다.

  • 대답.지우기();
  • 대답.내용 유형 = "text/xml";
  • 대답.콘텐츠 인코딩 = 인코딩입니다.UTF8;
  • 대답.콘텐츠 인코딩 = 인코딩입니다.UTF16;
  • 대답.내용 유형 = "text/xml; charset=utf-8";
  • 대답.내용 유형 = "text/xml; charset=utf-16";
  • 대답.끝()
  • 프론트 파일 내장이 찢어진 아스펙스를 사용하는 것.
  • ashx 파일 사용

마지막으로 도우미 기능의 내용을 다음과 같이 작성해야 한다고 상상해 보십시오.

///<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)
{
   ...
}

표시되는 모든 솔루션은 빈 asx 페이지를 가져와서 전면 파일의 HTML을 모두 트리밍하는 것으로 시작합니다(Visual Studio에서 경고가 발생함).

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

다음에는 다음을 사용합니다.Page_Load출력에 쓸 이벤트:

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

   Response.Write(xml);
}

내용을 변경해야 합니까?text/xml을 입력하시겠습니까?예:

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

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

가 야합니까전화해에 해야 합니까?Response.Clear 첫번째?

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

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

굳이 그렇게 부를 필요가 있을까요? 않습니다.Response.Clear합니다.<% ... %> 요한필불?

있습니까?Response.Clear코드 프런트 파일에 빈 줄이나 공백을 남겨둔 경우에 대비하여 더 강력하게 만들 수 있습니까?

HTML을 출력하지 않는 것으로 이해되기 때문에 asx를 빈 asx 메인 파일로 사용하는 것과 동일합니까?


가 야합니까전화해에 해야 합니까?Response.End다음과 같이 입력합니다.

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

그 후에 일어날 수 있는 다른 일은?Response.Write지금 당장 응답을 끝내야 한다고요?


의 내용 입니다.text/xml충분합니다. 아니면 대신 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();
}

아니면 구체적으로 그것이 아니어야 합니까?내용 유형에 문자 집합이 있지만 속성을 설정하지 않으면 서버가 손상됩니까?

예를 들어 다음과 같은 다른 콘텐츠 유형이 필요합니다.

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

을 문자 집지합니까야어되정으로 ?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();
}

사중을 사용하고 .Response.ContentEncoding▁은▁betterming▁into다보▁it것.Response.ContentType더심까니? 받습니까?전자 제품이 지원됩니까?후자인가요?


것이 String을 쓰는 것을 원합니다.XmlDocument누군가가 다음을 사용할 수 있다고 제안합니다.

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

의 사용에 주의합니다.Response.OutputStream에, 다는보는Response.Write이거 맛있어요? 안좋요? 더 나아요더 나아졌습니까?더 나빠요? 더 빨라요? 이 더 요?메모리 사용량이 많습니까?메모리 사용량이 적습니까?


당신이 당신의 가족을

페이지의 Render() 메서드에서 XML을 사용하여 Page_Load()를 사용할 때 발생하는 청킹 문제를 방지합니다.

청킹이 뭐죠?청킹의 문제는 무엇이며 사용 방법은 무엇입니까?Page_Render그들을 제거합니까?


는 내 나는나내쓰싶않다습니지의 XmlDocument그것이 기억을 낭비하기 때문에 물체를 문자열로 만들고 그것을 씁니다. 중 라도 좋지 입니다: 다, 중하도좋지않습다니라즉나음다.

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

유사한 질문

ASP.NET에서 XML을 반환하는 방법

레퍼런스

ASP.NET 1.1의 ASPX에서 XML을 반환하는 방법

ASP.NET 웹 페이지에 XML 출력 쓰기

ASP.NET에서 XML을 어떻게 출력합니까?

ASP.NET에서 ASHX 처리기 생성

XML을 ASP.NET의 클라이언트에 반환하는 적절한 방법을 찾았습니다.제가 잘못된 길을 지적하면 올바른 길을 더 이해할 수 있을 것이라고 생각합니다.

올바르지 않음:

Response.Write(doc.ToString());

올바르지 않음:

Response.Write(doc.InnerXml);

올바르지 않음:

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

정답:

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

사용하기Response.Output

다이지만, 둘다개지만이울,,,Output텍스트 작성기입니다.언제XmlDocumentTextWriter에 저장하면 해당 TextWriter에서 지정한 인코딩을 사용합니다.XmlDocument는 TextWriter에서 사용하는 인코딩(예: 이 경우 XML 선언 노드:

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

될 것입니다

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

이는 TextWriter가 UTF-8로 설정되었기 때문입니다. (자세한 내용은 잠시 후)TextWriter는 문자 데이터를 입력할 때 설정된 인코딩에 적합한 바이트 시퀀스로 인코딩합니다.

올바르지 않음:

doc.Save(Response.OutputStream);

이 예제에서는 문서가 인코딩 변경을 수행하지 않는 OutputStream에 잘못 저장되어 응답의 내용 인코딩 또는 XML 선언 노드의 지정된 인코딩과 일치하지 않을 수 있습니다.

맞아요.

doc.Save(Response.Output);

XML 문서가 TextWriter 개체에 올바르게 저장되어 인코딩이 올바르게 처리됩니다.


인코딩 설정

헤더에서 클라이언트에 제공되는 인코딩:

Response.ContentEncoding = ...

XML 문서의 인코딩과 일치해야 합니다.

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

클라이언트로 전송된 바이트 시퀀스에 있는 실제 인코딩과 일치해야 합니다.이 세 가지가 모두 일치하도록 하려면 한 줄을 설정합니다.

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

인코딩이 응답 개체에 설정된 경우 TextWriter에 동일한 인코딩을 설정합니다.TextWriter의 인코딩 세트로 인해 XmlDocumentxml 선언을 변경합니다.

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

문서가 저장된 경우:

doc.Save(someTextWriter);

응답 출력에 저장

문서를 이진 스트림에 저장하거나 문자열을 작성하지 않을 수 있습니다.

올바르지 않음:

doc.Save(Response.OutputStream);

여기서 XML은 이진 스트림에 잘못 저장됩니다.마지막 바이트 인코딩 시퀀스가 XML 선언 또는 웹 서버 응답의 내용 인코딩과 일치하지 않습니다.

올바르지 않음:

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

여기서 XML은 인코딩이 없는 문자열로 잘못 변환됩니다.XML 선언 노드는 응답의 인코딩을 반영하도록 업데이트되지 않으며 응답이 응답의 인코딩과 일치하도록 올바르게 인코딩되지 않습니다.또한 XML을 중간 문자열에 저장하면 메모리가 낭비됩니다.

XML을 문자열에 저장하거나 XML을 문자열에 채우고 싶지 않은 경우response.Write문자열, 이유:

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

사용하기doc.Save(Response.Output);

사용 안 함doc.Save(Response.OutputStream);

사용 안 함Response.Write(doc.ToString());

'응답'을 사용하지 마십시오.쓰기(doc).InnerXml);`


내용 유형 설정

Response Contents 답내용Type은 유을다음설정합니다야해로 해야 ."text/xml"을 보내는 . 사용자가 XML을 것을 알지 못합니다.

최종 답변

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

전체 예제

Rob Kennedy는 제가 처음부터 끝까지 예시를 넣지 못했다는 좋은 지적을 받았습니다.

Patron 정보 가져오기.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; } }
}

ASPX의 코드가 정상적인 실행을 가로채는 것을 허용하지만 XML을 보내는 데는 ashx를 사용하는 것이 이상적입니다.

Response.Clear()

만약 당신이 이미 응답에 아무것도 버렸다고 확신하지 않는다면, 저는 이것을 사용하지 않습니다. 찾아서 제거하세요.

Response.ContentType = "text/xml"

일반 클라이언트는 이 컨텐츠 유형이 없으면 컨텐츠를 XML로 수락하지 않습니다.

 Response.Charset = "UTF-8";

응답 클래스가 내용 유형 헤더 작성을 제대로 처리하도록 합니다.UTF-8은 정말, 정말 그럴만한 이유가 없는 한 사용하십시오.

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

캐시 헤더를 보내지 않으면 일부 브라우저(즉, IE)가 응답을 캐시하므로 이후 요청이 반드시 서버로 오지는 않습니다.IE의 또 다른 버그로 인해 HTTPS에서 이 작업을 수행하려면 브라우저에서 응답 허용도 필요합니다.

XmlDocument의 내용을 보내려면 다음을 사용합니다.

dom.Save(Response.OutputStream);

dom.Save(Response.Output);

인코딩이 일치하는지 확인하십시오(UTF-8을 사용하는 또 다른 좋은 이유).

XmlDocument개체가 자동으로 포함된 개체를 조정합니다.encoding="...".Response (예:)UTF-8)

Response.End()

만약 당신이 ASPX를 정말로 사용해야 하지만 그것이 약간 극단적이라면, ASX에서는 하지 마세요.

아래는 제가 생각하는 올바른 방법의 예입니다.적어도 제가 사용하는 것입니다.응답을 수행해야 합니다.이미 채워진 헤더를 제거합니다.올바른 내용을 전달해야 합니다.텍스트/xml 형식입니다.그것이 당신이 xml을 제공하는 방식입니다.일반적으로 대부분의 파서가 기대하는 것처럼 UTF-8을 Charset으로 제공하고자 합니다.하지만 꼭 그래야 한다고는 생각하지 않습니다.그러나 변경할 경우 xml 문서 선언을 변경하고 그 안에 문자 집합을 표시해야 합니다.XmlWriter를 사용해야 UTF-8로 쓸 수 있으며 기본 문자 집합이 아닙니다.그리고 당신의 xml 데이터를 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
   ' -----------------------------------------------------------------------------

적어도 10개의 질문이 여기서 하나로 합쳐진 것 같습니다. 몇 가지 요점입니다.

대답.맑음 - 앱에서 다른 어떤 일이 일어나고 있는지에 따라 다릅니다. 파이프라인 초기에 원하지 않는 내용을 쓸 수 있는 http 모듈이 있다면 삭제하십시오.테스트해보고 알아보세요.이에 유용한 Fiddler 또는 Wireshark.

컨텐츠 유형 text/xml - yep - good idea - HTTP 사양에서 이것이 왜 중요한지 읽어봅니다.IMO 웹 작업을 하는 모든 사람은 적어도 한 번은 1.0과 1.1 사양을 읽었을 것입니다.

인코딩 - xml은 어떻게 인코딩됩니까? - 만약 그것이 utf-8이라면 그렇게 말하고, 그렇지 않다면 다른 적절한 것을 말하고, 그것들이 모두 일치하는지 확인하십시오.

페이지 - 개인적으로 페이지를 사용하는 경우에는 asx 또는 http 모듈을 사용하고 조금 더 빠르게 하려면 자동 이벤트 연결을 제거하고 이벤트 핸들러를 수동으로 바인딩합니다.

먼저 xml을 문자열로 덤프하는 것은 메모리 낭비일 수 있지만 xml의 크기에 따라 인식 여부가 크게 달라집니다.

다른 사람들이 제안했듯이 xml을 출력 스트림에 저장하는 것이 가장 빠릅니다. 일반적으로 그렇게 할 것입니다. 하지만 확실하지 않다면 테스트해 보십시오. 인터넷에서 읽은 내용에 의존하지 마십시오.내가 하는 말을 그냥 믿지 마세요.

다른 접근 방식으로, xml이 그렇게 많이 변경되지 않는다면 디스크에 쓰고 파일을 직접 제공하면 됩니다. 이는 상당히 성능이 좋을 수 있지만 프로그래밍의 모든 것과 마찬가지로...

.NET 4.0에서 사용할 수 있는 XDocument/XElement를 사용할 수 있고 XML을 훨씬 쉽게 출력할 수 있다는 사실은 아무도 언급하지 않은 것 같습니다.

아래는 핸들러를 호출하여 스트림 데이터를 수신하고 xml 문서로 로드하는 서버 측 코드입니다.

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

다음은 처리기가 서버 측에 xml 데이터를 포함하는 스트림 데이터를 반환하는 방법입니다.

여기 데이터를 반환하는 핸들러 코드가 있습니다.

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

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

당신은 기본적으로 이미 모든 것에 대답을 했으니, 여기서 요점이 무엇인지 잘 모르겠습니다.

FWIW 나는 httpandler를 사용할 것입니다. 페이지 라이프사이클을 호출하고 XML 문서에 맞지 않는 뷰 상태와 세션의 조각을 잘라내야 하는 것은 의미가 없는 것 같습니다.오토바이를 만들기 위해 자동차를 사서 부품을 분해하는 것과 같습니다.

그리고 콘텐츠 유형은 모두 중요합니다. 즉, 요청자가 응답을 어떻게 처리해야 하는지를 파악하는 방법입니다.

언급URL : https://stackoverflow.com/questions/543319/how-to-return-xml-in-asp-net

반응형