在运行时从WSDL生成代理类?

4

我目前正在开发一个Windows服务,启动时会加载一些脚本并编译它们以便按计划运行,但其中一些脚本需要访问ASMX Web服务。

我的首选是在代码中使用这些WSDL文件生成.vb文件,以便我可以直接编译。

如何在不使用命令行的情况下实现这一点?


“without the command line” 的意思是在程序中直接操作,而不调用其他外部应用程序吗? - Gerardo Grignoli
调用 ´wsdl.exe´ 有什么问题? - Gerardo Grignoli
1个回答

2

我并不是很明白,为什么你不想使用来自命令行的本地/传统工具,但是这里有一个解决方案:

var wsdlDescription = ServiceDescription.Read(YourWSDLFile);
      var wsdlImporter = new ServiceDescriptionImporter();
      wsdlImporter.ProtocolName = "Soap12"; //Might differ
      wsdlImporter.AddServiceDescription(wsdlDescription, null, null);
      wsdlImporter.Style = ServiceDescriptionImportStyle.Server;
      wsdlImporter.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
      var codeNamespace = new CodeNamespace();
      var codeUnit = new CodeCompileUnit();
      codeUnit.Namespaces.Add(codeNamespace);
      var importWarning = wsdlImporter.Import(codeNamespace, codeUnit);
      if (importWarning == 0) {
        var stringBuilder = new StringBuilder();
        var stringWriter = new StringWriter(stringBuilder);
        var codeProvider = CodeDomProvider.CreateProvider("Vb");
        codeProvider.GenerateCodeFromCompileUnit(codeUnit, stringWriter, new CodeGeneratorOptions());
        stringWriter.Close();
        File.WriteAllText(WhereYouWantYourClass, stringBuilder.ToString(), Encoding.UTF8);

      } else {

        Console.WriteLine(importWarning);

      }

注意

这取决于 System.CodeDomSystem.CodeDom.Compiler
您还可以通过将 CodeDomProvider.CreateProvider("Vb") 替换为 CodeDomProvider.CreateProvider("CSharp") 来生成一个c#文件。
此代码已经测试过,使用了这个WSDL,它相当简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接