38180


Asp.Net Core MVC - CentOS7 の環境で、  
wget や curl を使用することなく cron ジョブを実行したり、  
mail forward からの標準入力を処理したりするにはどうしたら良いでしょうか？

PHPの場合、以下のようにして標準入力を処理していました。

[code]

    "/usr/bin/php -q /home/user/public_html/index.php controller method"
    
[/code]

また標準入力の内容は以下のようにして取得していました。

[code]

    $fp = @fopen('php://stdin', 'r');
    
[/code]

これと等価な事をAsp.Net Core MVCでやる方法を教えて頂けないでしょうか。  
よろしくお願いします。


CC BY-SA 3.0
2017-09-25T09:50:55.297
38176
2019-11-16T14:54:58.930
22913
question
c# linux centos .net asp.net
asp.net core mvc にてStdin(CLI)を受け付ける方法


ASP.NET
Coreアプリケーションのプロジェクト内には`Main`メソッド(通常`Program.cs`内)が定義されており、ここで下記のようにWebアプリケーションの構成と実行を行っています。

[code]

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
            // hostの作成方法は一例です
    
            host.Run();
        }
    }
    
[/code]

最後の`IWebHost.Run()`の呼び出しがWebアプリケーションの起動に当たりますので、コマンドライン引数`args`の値によって`Run()`以外の処理を行えば通常のコンソールアプリケーションとして動作します。

[code]

    if (args[0] == "controller"
       && args[1] == "action")
    {
        // 特別な処理
    }
    else
    {
        host.Run();
    }
    
[/code]

実行する処理については`host.Services.GetService(Type)`メソッドで標準のDependency
Injectionを利用できます。引数の`Type`は実際のコントローラーでも良いのですが、HTTPに依存しない共通クラスの方が好ましいです。

[code]

    var hoge = (HogeService)host.GetService(typeof(HogeService));
    hoge.ExecuteFuga();
    
    // HogeControllerでもHogeServiceをコンストラクター引数に追加し、アクションで`ExecuteFuga`を使用すること。
    
[/code]

もし`args`の判定で任意のアクションを使用したいのであれば、`IActionDescriptorCollectionProvider`サービスからアクションの情報を検索することができます。ただ引数の問題もありますのでお勧めはしません。

なお上記の方法ではWebアプリと同一の構成を使用するために`host`を作成していますが、不要であれば直接`ServiceCollection`を`Configure`したり、あるいはDIを使用せずに直接インスタンスを作成するような実装でも問題ありません。

最後に標準入力ですが、`Console.In`(テキスト)や`Console.OpenStandardInput`(バイナリー)を使用すればよいです。


CC BY-SA 3.0
2017-09-25T14:16:34.787
38180
2017-09-25T14:16:34.787
5750
38176
answer


いままで php の経験が長く、新しく ASP.NET CORE に取り組み始めた方でしょうか？

単純に dotnet Core の コンソールアプリを使って標準入力を読み込むプログラムを作ればいいと思います。

ASP.NET Core が 動作しているという事は サーバー上に dotnet 実行環境が整っているはずなので ビルドして生成された .exe ファイルを
Linux で 実行権限をつければ 実行できます。

標準入力の読み込みは `Console.ReadLine()` 等をつかえばいいかと・・。  
利用する nuget パッケージや DI 設定をすると ASP.NET CORE のプログラムと  
ほぼ同様なことが コンソールアプリで実行できます。


CC BY-SA 4.0
2019-11-16T14:54:58.930
60592
2019-11-16T14:54:58.930
18851
38176
answer