WSDL から XML Web サービスのソースコードを生成

WSDL から XML Web サービスを生成する機能を Visual Studio で探したけど、 見つけられなかったのでコード書いてみた。

System.Web.Services.Description 名前空間にある ServiceDescription と ServiceDescriptionImporter、 あと CodeDom を使って生成できた。

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Text;
using System.Web.Services.Description;
using System.Xml.Serialization;

namespace WebServiceGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("WebServiceGenerator.exe wsdlFilePath outputFilePath");
                return;
            }

            var wsdlFilePath = args[0];
            var outputFilePath = args[1];
            if (File.Exists(wsdlFilePath) == false)
            {
                Console.WriteLine($"'{wsdlFilePath}' is not found.");
                return;
            }

            // WSDL を読み込む
            var description = ServiceDescription.Read(wsdlFilePath);

            var importer = new ServiceDescriptionImporter
            {
                ProtocolName = "Soap",  // 今回は SOAP
                Style = ServiceDescriptionImportStyle.Server,
                CodeGenerationOptions = CodeGenerationOptions.GenerateProperties,
            };
            importer.AddServiceDescription(description, null, null);

            var codeNamespace = new CodeNamespace();
            var codeUnit = new CodeCompileUnit();
            codeUnit.Namespaces.Add(codeNamespace);

            // 読み込んだ WSDL から XML Web サービスのコードを生成
            var importWarnings = importer.Import(codeNamespace, codeUnit);
            if (importWarnings != 0)
            {
                // 警告が出ていたら失敗とみなす
                Console.WriteLine($"failed! - ({importWarnings})");
                return;
            }

            // XML Web サービスを C# コードでファイルに出力
            using(var writer = new StreamWriter(outputFilePath, false, Encoding.UTF8))
            {
                var codeProvider = CodeDomProvider.CreateProvider("CSharp");
                codeProvider.GenerateCodeFromCompileUnit(codeUnit, writer, new CodeGeneratorOptions());
            }

            Console.WriteLine("succeeded!");
        }
    }
}