我正在尝试使用ServiceContractGenerator从wsdl生成C#中的Web服务客户端。我是这堂课的新手。我正在使用代码,因为它出现在微软网站上的示例中,以及我从网上看到的内容。当我在wsdl上运行Svcutil.exe时,我在C#代码中获得了相同命名空间中的所有类型。当我使用ServiceContractGenerator时,它将客户端代码放在我指定的命名空间中,但它为wsdl类型创建了第二个命名空间。 wsdl有一个这样的部分:
<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: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();
我为客户端类CorrespondenceAdminClient获取了WebServices客户端的命名空间,并为所有参数和返回类型获取了zzz.Correspondence的命名空间。 Svcutil将它们全部放在WebServices客户端中。我似乎错过了一些东西。
您可能需要重新定义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();