質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

ASP.NET Webフォーム:「要求された情報を決定する前にプロセスを終了させる必要があります」というエラーの解決方法が分からない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 600

t.okuno

score 9

ASP.NET Webフォームにて、シャットダウンした機械を遠隔で起動させる社内用のWebサイトを作成しています。
その際に「要求された情報を決定する前にプロセスを終了する必要があります」というエラーメッセージが表示されてしまい、解決の方法が分からず困っています。

開発環境

OS:Windows 10 Pro (1909)
ツール:Visual Studio 2017 (「ASP.NET Webアプリケーション(.NET Framework)」から「Webフォーム」を選択して使用)
データベース:Microsoft Access Database (.accdb)

ソース

※こちらの判断で「重要ではない」としたソースは一部省略してあります。

SetupUser.aspx(body部分のみ抜粋)

<body>
  <form id="form1" runat="server">
    <table>
      <tr>
        <th>ユーザー選択</th>
        <td>
          <asp:DropDownList ID="List1" runat="server" DataSourceID="Source1" DataTextField="Name" DataValueField="Id">
          </asp:DropDownList>
          <asp:SqlDataSource ID="Source1" runat="server" SelectCommand="SELECT [Name], [Id] FROM [Table1]">
          </asp:SqlDataSource>
        </td>
      </tr>
      <tr>
        <td>
          <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"/>
        </td>
      </tr>
      <tr>
        <td>
          <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        </td>
      </tr>
    </table>
  </form>
</body>


SetupUser.aspx.cs

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Diagnostics;

public partial class Class1 : Page
{
    protected void Page_Load(object sender, EventArgs e) { }

    protected void Button1_Click(object sender, EventArgs e)
    {
        var param = DropDownList1.SelectedValue;
        var proc = Process.Start("C:\\test.exe", param);  // Webサーバー内のexeを起動
        if (proc == null)  // エラーメッセージを画面に表示
            Label1.Text = "エラーが発生しました。";
        else
        {
            proc.WaitForExit();  // プロセスが終了するのを待つ

            var ecode = proc.ExitCode;  // エラーコード取得
            if (ecode == 0)  // エラーコードが0なら正常終了
                Label1.Text = "起動できた模様です。";
            else  // それ以外なら簡単なエラーメッセージを表示
                Label1.Text = $"以下のエラーコードが返送されました:{ecode}";
        }
    }
}


データベースから取得した情報をセレクトボックス形式で表示させ、その中から選択されたユーザー情報を用いて別のマシンを遠隔起動させます。「Test.exe」は実際にマシンの起動を行うアプリで自作のアプリですが、私が作ったわけでないので実際にどういう処理が行われているかまでは把握できていません。

運用環境

OS:Windows Server 2012 Standard

先程のWebフォームをこちらの機械に設定したIISに組み込みました。もともとの「Default Web Site」をローカルパスを今回のファイルパスへ変更する形で使用しています。

現象

ユーザー情報を選択してボタンを押下し、Button1_Click関数を動かすと以下のようなエラー画面が表示されます。


'/'アプリケーションでサーバーエラーが発生しました。

要求された情報を決定する前にプロセスを終了させる必要があります。

スタックトレース:
[InvalidOperationException: 要求された情報を決定する前にプロセスを終了させる必要があります。]
System.Diagnostics.Process.EnsureState(State state) +8292424
System.Diagnostics.Process.get_ExitCode() +22
WebForm1.Setup.Button1_Click(object sender, EventArgs e) in C:\Users\...\SetupUser.aspx.cs:27
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +11594496
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +274
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1964


上の画面内にある「C:\Users\...\SetupUser.aspx.cs」は開発環境におけるSetupUser.aspx.csファイルのフルパスです。ちなみにブラウザにエラー画面は表示されますが、マシンの遠隔起動自体は成功している模様です。また開発環境にてデバッグで動かしたときは上記のようなエラーは発生せず、正常に処理を終了しました。

スタックトレースを見る限り、SetupUser.aspx.csファイルのvar ecode = proc.ExitCode;の箇所で何らかのエラーが発生しているのは素人目でもわかるのですが、これをどう解決したらいいのか分かりません。どなたかご教示お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

まず始めに、自分はProcess.Startを使う必要がほとんどないため、あまり詳しくありません
なので、さらっとググった結果です

Process.ExitCode プロパティ
MSのサンプルコードを見るとusing(){}でくくってますので、Dispose(多分リソースの破棄)を行う必要があるのではないでしょうか?
また、myProcess.HasExitedで終了したかどうかの確認と、終了してない場合にProcess.Refresh メソッドで情報を破棄しているようです
Refresh実行後に最初のアクセスで情報を再取得しているようです
そのため、こういった内部にキャッシュした情報の破棄と再取得を行わないと内部的には正しく終了できていないので質問にある例外が発生しているのでは?と思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/08 09:31 編集

    教えていただいたProcess.ExitCodeプロパティのページを基にソースを組み直した結果、エラーが改善され正常に終了するようになりました。
    ご協力誠にありがとうございました。

    キャンセル

0

単なる想像ですので当たっているかどうかは分かりませんが・・・

また開発環境にてデバッグで動かしたときは上記のようなエラーは発生せず、正常に処理を終了しました。

ASP.NET Web Forms アプリが開発環境で動いて運用環境で動かない原因として、よくあるのはワーカープロセスのアクセス権の違いです。

開発環境では Visual Studio からアプリを起動して IIS Express 上で動かしたのだと思いますが、そうするとワーカープロセスは開発マシンにログインした質問者さんのアカウント(管理者?)のアクセス権を持っているはずです。

一方、運用環境の Windows Server 2012 Standard の IIS でアプリを動かした場合、デフォルトでは「アプリケーション プール ID」(詳細は下記記事を参照してください)となり低い権限しか持ちません。たぶんそれから起動されたプロセスも同じ権限しか持たないので期待通り動かないということではないかと思います。

アプリケーション プール ID
https://docs.microsoft.com/ja-jp/previous-versions/ee886292(v=technet.10)

「アプリケーション プール ID」はネットワーククレデンシャルを持つので、AD 環境であれば上の記事の「ネットワークへのアクセス」のセクションに書いてあるようにするとか、ちょっと乱暴ですが IIS のワーカープロセスを「遠隔で起動」に必要なアクセス権を持つアカウントに設定してみるとかで検証してはいかがですか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/07 15:59 編集

    早急のご回答ありがとうございました。
    早速試してみましたが、変化は見られませんでした。
    ワーカープロセスのアクセス権が原因ではないようです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • ASP.NETに関する質問
  • ASP.NET Webフォーム:「要求された情報を決定する前にプロセスを終了させる必要があります」というエラーの解決方法が分からない