본문 바로가기
c#

<string xmlns="http://tempuri.org/"> </string> 없애기

by ┌(  ̄∇ ̄)┘™ 2022. 6. 15.
728x90

ASP.NET의 ASMX 웹 서비스(.asmx)에서 JSON을 반환하려고 하면, 순수 JSON이 아니라 이렇게 XML로 감싸진 응답이 나오는 경우가 있습니다.

<string xmlns="http://tempuri.org/">{...json...}</string>

클라이언트(JavaScript)에서는 이 XML 래핑 때문에 document is empty나 파싱 오류를 만나게 됩니다. 원인은 WebMethod의 기본 반환 직렬화가 XML(SOAP)이기 때문입니다 — 문자열을 return하면 .NET이 그 문자열을 다시 XML 요소로 감싸 버립니다.

해결 — Response에 직접 쓰기

메서드가 값을 return하게 두지 말고, void로 선언한 뒤 Response.Write()로 직접 JSON을 출력하면 프레임워크의 XML 래핑을 우회할 수 있습니다.

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void MyFunction()
{
    // 응답 타입을 JSON으로 명시
    HttpContext.Current.Response.ContentType = "application/json";

    // 객체를 직렬화
    string result = new JavaScriptSerializer()
        .Serialize(new { result = list });

    // return 대신 직접 출력 → XML 래핑 회피
    HttpContext.Current.Response.Write(result);
}

핵심 포인트

  • 반환 타입을 void — 값을 return하는 순간 .NET이 XML로 감쌉니다.
  • Response.ContentType = "application/json" — 클라이언트가 JSON으로 인식하도록 명시.
  • Response.Write()로 직접 출력 — 프레임워크의 직렬화 계층을 건너뜁니다.
  • 출력 후 남은 응답이 섞이지 않도록, 필요하면 Response.End()ApplicationInstance.CompleteRequest()로 마무리하는 것도 방법입니다.

참고 — 더 나은 대안

이 방법은 레거시 ASMX에서의 응급 처치입니다. 새로 개발한다면 처음부터 JSON을 자연스럽게 반환하는 ASP.NET Web APIASP.NET Core를 쓰는 것이 정석입니다 — 컨트롤러에서 객체를 return하면 알아서 JSON으로 직렬화되고, tempuri 래핑 문제 자체가 존재하지 않습니다.

728x90

댓글