2016-07-20 6 views
4

Ich arbeite derzeit einen Windows-Dienst, der, wenn er gestartet wird, eine Menge Skripts benötigt und sie zum Ausführen nach einem Zeitplan kompiliert. Einige dieser Skripte müssen jedoch auf ASMX-Webdienste zugreifen.Generierung von Proxy-Klasse von WSDL im laufenden Betrieb?

Meine Präferenz wäre, diese WSDL-Dateien im Code zu verwenden, um die .vb-Datei zu generieren, die ich kompilieren kann.

Wie kann ich dies ohne die Befehlszeile erreichen?

+0

'ohne die Befehlszeile' bedeutet programmatisch, ohne andere externe App aufzurufen? –

+0

Was ist falsch beim Aufruf von'wsdl.exe '? –

Antwort

2

ich wirklich nicht bekommen, warum Sie nicht wollen, die nativen/Legacy-Tools von Commandline verwenden, aber hier geht:

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); 

     } 

Hinweis

Diese auf System.CodeDom abhängig ist und System.CodeDom.Compiler
Sie können auch eine C# Datei erstellen, indem Sie CodeDomProvider.CreateProvider("Vb") durch CodeDomProvider.CreateProvider("CSharp")
ersetzen Diese C ode wird mit this WSDL getestet, was ziemlich einfach ist.