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 API나 ASP.NET Core를 쓰는 것이 정석입니다 — 컨트롤러에서 객체를 return하면 알아서 JSON으로 직렬화되고, tempuri 래핑 문제 자체가 존재하지 않습니다.
728x90
'c#' 카테고리의 다른 글
| 구 닷넷프레임워크 버전에서 TLS1.2 사용 절차 (0) | 2024.12.07 |
|---|---|
| 기본 연결이 닫혔습니다. 보내기에서 예기치 않은 오류가 발생했습니다. (0) | 2023.11.07 |
| System.Web.Helpers.Json..cctor() 메서드가 System.Web.Helpers.Json.CreateSerializer() 메서드에 액세스하지 못했습니다 (0) | 2015.09.07 |
| zedgraph (0) | 2013.04.27 |
| EventType clr20r3 P9 system.io.fileloadexception (0) | 2013.04.27 |
댓글