質問: mp.StandardOutput.ReadToEnd(); //→sをブラウザに表示させる ```
回答: ASP.NETで稼動するプロセスは、通常、ASP.NET用のWindowsサービスのコンテキストで動作して、適切な権限を割り当てています。Windowsサービスはデスクトップとの対話ができないようになっているので、従って標準入出力のハンドルもあらかじめ閉じられていて、プロセスを起動できても、標準入出力を介したやり取りは恐らくできないと思います。 Visual Studio でのデバッグですと、そのデバッグしているユーザーアカウントでローカルなデバッグ用ASP.NETサーバーとデバッグ対象のプログラムが動作するので、ASP.NETの本番用とは動作環境が異なることになります。 もし、HTMLのフォームに入力された値を標準入出力でやり取りしたいのであれば、ASP.NETではなく、CGIとして設置する必要があります。 2018/03/22 12:48 追記 ※コメントに書こうとしましたが、長文になりましたので追記します。 > > そもそもこの構成が実現可能なのかどうかも含めて、何卒、ご教示くださいませ。 > > > その構成ですと不可能だと思います。バッチファイル中で標準入出力を利用して作成したファイルは意図通りの結果とならないと思ってください。パイプ(`|`)もリダイレクト(`>`)も、標準入出力が使えてこそ、意図通りに動作します。 詳細な理由は別回答でSurferOnWwwさんが述べられている内容を理解する必要があります。 端的に書くと「IISは、ユーザー対話モードでアプリを実行しない、ワーカープロセスから起動したバッチファイル内では標準入出力を使えない」と言うことになるのですが、これは回避できません。 IISではないですが、私も過去、Windowsサービス中で標準入出力で他プロセスとやり取りしようとして挫折しました。と言いますかアプローチが間違っているのでとっとと違う方法にしたのですが。 話を戻しますと、、 > > 実行したいexeがC\Program Filesにあるのが原因だと思うのですが、 > > > C:\Program Files下にあっても、起動自体はできてます。`"echo "入力データ" | 実行ファイル" として、実行したいEXEに標準入力を流し入れようとすること自体が不可能、と言うことです。 CGIであれば、そのCGIプロセスが標準入力として取り込めるようにIISが準備してから呼び出します。 (UNIX系OSのように、ソケットのハンドルを標準入出力のハンドルに繋ぎ換えているはず) > > テキストファイルは生成されるものの、空のテキストファイルが生成されてしまいます...(ローカル実行なら問題なく動作します) > > > (`>`)の指定でバッチファイルを実行しているCMD.EXEがファイルを新規で開くものの、標準入力が流れてこないまま終わり、ファイルを閉じる為、空になってます。 ローカルで実行するとOKなのは、デスクトップで実行しているからです。(デスクトップで実行している、などと言う表現がそもそも分かりづらいのですが、要はユーザーがログオンして画面上で操作している、と思ってください) 私の先の回答では、ワーカープロセス内から ``` 実行したいexe /IN 入力データが入ったファイル /OUT 出力結果を格納するファイル ``` のような感じでコマンドラインオプションを指定できるよう、実行したいexeプログラムを改変する、と言う提案のつもりでした。実行したいexeのプログラム自体をRockyさんの方で改変できないのであれば、CGIとして動作させるしか簡単な方法はないように思います。 あと方法として思いつくものとしては(**まったくお勧めできませんが**)、IISのワーカープロセスと名前付きパイプ等のプロセス間通信を行うデスクトップアプリをひとつ作成してログオンしたデスクトップに常駐させ、ワーカープロセスからのリクエストに応じて実行し、結果をワーカープロセスへ返す、とのような方法です。これだとデスクトップからログオフするともう使えないので致命的です。