문제
Visual Studio의 GUI에서 SOAP서비스를 추가하는 경우 WSDL의 내부의 XSD 데이터 구조를 자동으로 Class로 생성해준다. 하지만 vscode 등에서 cli 환경으로 서비스를 추가할 때, 내부의 xsd는 가져오지 못하는 경우가 발생한다.

해결방법
1. wsdl 파일 생성
브라우저에서 wsdl 페이지로 이동 한 뒤, XML내용 본문을 복사하여 .WSDL파일로 프로젝트에 저장한다.
2. xsd 파일 생성
XSD파일이 로컬에 있으면 로컬 파일을 프로젝트에 옮겨주고, 없으면 WSDL을 브라우저에서 "{WSDL주소}?schema={XSD이름}"으로 접속한다.
EX) "http://{IP}:{PORT}//*/*.asmx?schema={abcData}"
브라우저에 접속하면 xsd에 해당하는 데이터 구조를 확인할 수 있는데, 이 코드들을 .xsd파일로 프로젝트에 저장한다.

3. class 파일 생성
CLI환경에서 XSD데이터 구조를 Class로 생성하지 못한 이유는 dotnet-svcutil을 통해 wsdl을 참조추가할 때 System.Data.Design.TypedDataSetSchemaImporterExtension을 호출하거나 사용하지 않기 때문이다.
* TypedDataSetSchemaImporterExtension의 역할
- 역할: 이 클래스는 XML 스키마(XSD)를 .NET 형식(특히 `System.Data.DataSet`에서 파생된 강력하게 형식화된 DataSet)으로 매핑하는 과정, 즉 스키마 가져오기(Schema Importing) 과정에 관여하는 확장 지점.
- 사용 주체: 주로 `xsd.exe`나 Visual Studio의 "데이터셋 구성 마법사", 또는 WSDL/웹 서비스 참조 추가 기능과 같은 도구들이 내부적으로 이 확장 지점을 활용하여 XSD를 기반으로 강력하게 형식화된 `DataSet` 코드를 생성.
VS Code는 Visual Studio IDE와 달리 "Add Service Reference"나 "Add Data Source" 같은 GUI 마법사 기능을 직접 제공하지 않는다. 따라서 `TypedDataSetSchemaImporterExtension`이 내부적으로 동작하게 하는 명령어를 사용해야 한다.
4. 서비스 추가
다운로드한 파일들이 있는 폴더에서 아래 명령어를 Command Prompt에서 실행한다. svcutil이 환경변수에 없는경우, 경로를 찾아 fullpath로 실행한다.
svcutil.exe MailWebService.wsdl mySingleCSVOData.xsd /language:cs /out:MailServiceReference.cs /config:app.config
- `MailWebService.wsdl mySingleCSVOData.xsd`: `svcutil`에게 서비스의 메인 WSDL과 참조하는 모든 XSD 파일을 명시적으로 제공한다. 이렇게 하면 `svcutil`이 인터넷에서 `schemaLocation`을 찾아 헤맬 필요 없이, 로컬 파일에서 모든 스키마 정보를 가져와 처리할 수 있게 된다.
'C#' 카테고리의 다른 글
| 조건문으로 처리 vs 예외로 처리 (0) | 2025.08.20 |
|---|---|
| [C#] 비동기 프로그래밍 가이드(Async and Await) (0) | 2024.12.21 |
| [C#] Byte 크기로 문자열 길이 제한하기 (0) | 2024.08.29 |
| [C#] IOException: Sharing violation on path 에러 해결 (0) | 2024.08.22 |
| [C#] InstallUtil.exe로 Windows Service 설치 시 에러 (0) | 2023.12.22 |