2017-02-16 8 views

答えて

0

私は、それをどのようにして実現するかという直接的な方法はないと信じています。少なくとも私は1つを見つけていない。なぜなら、後で自分自身に関する情報が明らかにされない限り、ASP.NET Coreアプリケーションは実際には親コンテキストについて何も知らない自己完結型アプリケーションだからです。

たとえば、設定ファイルでは、実行しているインストールの種類を確認できます:productionまたはdevelopmentです。 productionIISdevelopmentはそうではないと仮定できます。しかし、それは私のために働いていませんでした。私の生産設定はIISまたはwindows serviceのいずれかになります。

私は実行するはずの実行の種類に応じて、アプリケーションに異なるコマンドライン引数を指定することでこの問題を回避しました。それは実際には、私にとって自然に来ました。windows serviceは実際には異なるアプローチを必要とするからです。私の場合のコードの例については

はややそうのように見えた:

namespace AspNetCore.Web.App 
{ 
    using McMaster.Extensions.CommandLineUtils; 
    using Microsoft.AspNetCore; 
    using Microsoft.AspNetCore.Hosting; 
    using Microsoft.AspNetCore.Hosting.WindowsServices; 
    using System; 
    using System.Diagnostics; 
    using System.IO; 

    public class Program 
    { 
     #region Public Methods 

     public static IWebHostBuilder GetHostBuilder(string[] args, int port) => 
      WebHost.CreateDefaultBuilder(args) 
       .UseKestrel() 
       .UseIISIntegration() 
       .UseUrls($"http://*:{port}") 
       .UseStartup<Startup>(); 

     public static void Main(string[] args) 
     { 
      var app = new CommandLineApplication(); 

      app.HelpOption(); 
      var optionHosting = app.Option("--hosting <TYPE>", "Type of the hosting used. Valid options: `service` and `console`, `console` is the default one", CommandOptionType.SingleValue); 
      var optionPort = app.Option("--port <NUMBER>", "Post will be used, `5000` is the default one", CommandOptionType.SingleValue); 

      app.OnExecute(() => 
      { 
       // 
       var hosting = optionHosting.HasValue() 
        ? optionHosting.Value() 
        : "console"; 

       var port = optionPort.HasValue() 
        ? new Func<int>(() => 
        { 
         if (int.TryParse(optionPort.Value(), out var number)) 
         { 
          // Returning successfully parsed number 
          return number; 
         } 

         // Returning default port number in case of failure 
         return 5000; 
        })() 
        : 5000; 

       var builder = GetHostBuilder(args, port); 

       if (Debugger.IsAttached || hosting.ToLowerInvariant() != "service") 
       { 
        builder 
         .UseContentRoot(Directory.GetCurrentDirectory()) 
         .Build() 
         .Run(); 
       } 
       else 
       { 
        builder 
         .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)) 
         .Build() 
         .RunAsService(); 
       } 
      }); 

      app.Execute(args); 
     } 

     #endregion Public Methods 
    } 
} 

このコードは、ホスティング(serviceconsole - IISを使用することになっていることオプション)の選択タイプを可能にするだけでなく、することができますあなたがWindowsサービスとして実行しているときは、重要なポートを変更してください。

また、引数解析ライブラリMcMaster.Extensions.CommandLineUtilsを使用すると、構成されたコマンドラインスイッチに関する情報が表示されるため、適切な値を選択するのが簡単になります。

関連する問題