방법: 사용자 지정 WSDL 가져오기
이 항목에서는 사용자 지정 WSDL을 가져오는 방법에 대해 설명합니다. 사용자 지정 WSDL을 처리하려면 IWsdlImportExtension 인터페이스를 구현해야 합니다.
사용자 지정 WSDL을 가져오려면
IWsdlImportExtension를 구현해야 합니다. BeforeImport(ServiceDescriptionCollection, XmlSchemaSet, ICollection<XmlElement>) 메서드를 구현하여 메타데이터를 가져오기 전에 수정합니다. ph x="1" /> 및 ImportContract(WsdlImporter, WsdlContractConversionContext) 메서드를 구현하여 메타데이터에서 가져온 계약과 엔드포인트를 수정합니다. 가져온 계약이나 엔드포인트에 액세스하려면 해당 컨텍스트 개체(WsdlContractConversionContext 또는 WsdlEndpointConversionContext)를 사용합니다.
public class WsdlDocumentationImporter : IWsdlImportExtension { public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context) { // Contract documentation if (context.WsdlPortType.Documentation != null) { context.Contract.Behaviors.Add(new WsdlDocumentationImporter(context.WsdlPortType.Documentation)); } // Operation documentation foreach (Operation operation in context.WsdlPortType.Operations) { if (operation.Documentation != null) { OperationDescription operationDescription = context.Contract.Operations.Find(operation.Name); if (operationDescription != null) { operationDescription.Behaviors.Add(new WsdlDocumentationImporter(operation.Documentation)); } } } } public void BeforeImport(ServiceDescriptionCollection wsdlDocuments, XmlSchemaSet xmlSchemas, ICollection<XmlElement> policy) { Console.WriteLine("BeforeImport called."); } public void ImportEndpoint(WsdlImporter importer, WsdlEndpointConversionContext context) { Console.WriteLine("ImportEndpoint called."); } }
사용자 지정 WSDL 가져오기를 사용하도록 클라이언트 애플리케이션을 구성합니다. Svcutil.exe를 사용하는 경우 Svcutil.exe(Svcutil.exe.config)의 구성 파일에 이 구성을 추가해야 합니다.
<system.serviceModel> <client> <endpoint address="http://localhost:8000/Fibonacci" binding="wsHttpBinding" contract="IFibonacci" /> <metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata> </client> </system.serviceModel>
새 WsdlImporter 인스턴스(가져올 WSDL 문서를 포함하는 MetadataSet 인스턴스에 전달)를 만들고 ImportAllContracts를 호출합니다.
WsdlImporter importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();