2012-06-04 4 views
2

ServiceContractGenerator를 사용하여 wsdl에서 C#으로 웹 서비스 클라이언트를 생성하려고합니다. 나는이 수업을 처음 접했어. Microsoft의 사이트에있는 예제와 웹에서 읽은 코드에 나와있는 코드를 사용하고 있습니다. wsdl에서 Svcutil.exe를 실행하면 C# 코드에서 동일한 네임 스페이스의 모든 유형을 가져옵니다. ServiceContractGenerator를 사용할 때 클라이언트 코드를 지정한 네임 스페이스에 넣지 만 wsdl 유형의 두 번째 네임 스페이스를 만듭니다. 내가 사용하고ServiceContractGenerator는 네임 스페이스를 어떻게 생성합니까?

<wsdl:message name="ICorrespondenceAdmin_ListOwners_InputMessage"><wsdl:part name="parameters" element="tns:ListOwners"/></wsdl:message> 

코드로 정의 된 메시지가

generator = new ServiceContractGenerator(); 
    try { 
     generator.NamespaceMappings.Add("*", "WebServiceClients"); 
    } 
    catch (Exception) { 
    } 

    MetadataExchangeClient mexClient = 
     new MetadataExchangeClient(
      new Uri(uri), 
      MetadataExchangeClientMode.HttpGet); 

    mexClient.ResolveMetadataReferences = true; 
    MetadataSet metaDocs = mexClient.GetMetadata(); 

    WsdlImporter importer = new WsdlImporter(metaDocs); 

    System.Collections.ObjectModel.Collection<ContractDescription> contracts 
     = importer.ImportAllContracts(); 
    ServiceEndpointCollection eps = importer.ImportAllEndpoints(); 
    foreach (ContractDescription contract in contracts) { 
     generator.GenerateServiceContractType(contract); 
    } 


    if (generator.Errors.Count != 0) 
     throw new Exception("There were errors during code compilation."); 

    StringWriter stringWriter = 
     new StringWriter(System.Globalization.CultureInfo.CurrentCulture); 
    System.CodeDom.Compiler.IndentedTextWriter textWriter 
     = new System.CodeDom.Compiler.IndentedTextWriter(stringWriter); 

    codeDomProvider.GenerateCodeFromCompileUnit(
     generator.TargetCompileUnit, 
     textWriter, 
     options); 


    textWriter.Close(); 

내가 클라이언트에 대한 WebServicesclients의 네임 스페이스를 얻을이다

<wsdl:types><xsd:schema targetNamespace="http://tempuri.org/Imports"><xsd:import schemaLocation="http://devabntstapp10.psohealth.local/TZ_TCS_SERVICES/AdminService.svc?xsd=xsd0" namespace="http://tempuri.org/"/><xsd:import schemaLocation="http://yyy/zzz/AdminService.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/zzz.Correspondence"/><xsd:import schemaLocation="http:/yyy/zzz/AdminService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/></xsd:schema></wsdl:types> 

: WSDL의이 같은 섹션이 모든 매개 변수 및 반환 유형에 대한 CorrespondenceAdminClient 클래스 및 zzz.Correspondence의 네임 스페이스. Svcutil은이 모든 것을 WebServicesclients에 저장합니다. 나는 뭔가를 놓친 것 같다.

답변

2

아마도 XmlImportOptions 및 XsdDataContracts를 다시 정의해야하며 모든 유형이 xsdDataContracts에 의해 생성되지는 않습니다. generateServiceContract는이 네임 스페이스 만 변경합니다.

 importer.State.Remove(typeof(XsdDataContractImporter)); 
     var xsdDCImporter = new XsdDataContractImporter(); 
     xsdDCImporter.Options = new ImportOptions(); 
     xsdDCImporter.Options.Namespaces.Add("*", nameSpace); 
     importer.State.Add(typeof(XsdDataContractImporter), xsdDCImporter); 

     var xmlOptions = new XmlSerializerImportOptions(xsdDCImporter.CodeCompileUnit); 
     xmlOptions.ClrNamespace = nameSpace; 
     importer.State.Add(typeof(XmlSerializerImportOptions), xmlOptions); 

     System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts(); 
관련 문제