c# - ServiceContractGenerator如何生成命名空间

标签 c# wcf

我正在尝试使用 ServiceContractGenerator 从 wsdl 生成 C# 中的 Web 服务客户端。我是这个类的新人。我使用的代码几乎与 Microsoft 网站上的示例以及我从网上读到的代码相同。当我在 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 的 WebServicesclients 命名空间和所有参数和返回类型的 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();

关于c# - ServiceContractGenerator如何生成命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885293/

相关文章:

基于AD组的WCF Web服务认证

c# - 引用项目在编译时获取 "lost"

c# - WPF Datagrid 不显示所有值

c# - Active Directory COM 异常 - 发生操作错误 (0x80072020)

c# - 如何清除我使用过一次的 WCF HTTP 客户端的 PooledBufferManager?

c# - WCF 数据服务更新返回 401-未经授权 : Access is denied due to invalid credentials

c# - 网络错误: 405 Method Not Allowed in WCF

c# - 一个继承了DependencyObject的类如何使用?

c# - 使用 SelectMany() 的不同方式

WCF IErrorHandler 将 FaultException 返回给 SOAP,将 WebHttpException 返回给 POX 和 Json 端点