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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

5316閲覧

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

t.okuno

総合スコア10

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/04/07 05:30

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部分のみ抜粋)

ASPX

1<body> 2 <form id="form1" runat="server"> 3 <table> 4 <tr> 5 <th>ユーザー選択</th> 6 <td> 7 <asp:DropDownList ID="List1" runat="server" DataSourceID="Source1" DataTextField="Name" DataValueField="Id"> 8 </asp:DropDownList> 9 <asp:SqlDataSource ID="Source1" runat="server" SelectCommand="SELECT [Name], [Id] FROM [Table1]"> 10 </asp:SqlDataSource> 11 </td> 12 </tr> 13 <tr> 14 <td> 15 <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"/> 16 </td> 17 </tr> 18 <tr> 19 <td> 20 <asp:Label ID="Label1" runat="server" Text=""></asp:Label> 21 </td> 22 </tr> 23 </table> 24 </form> 25</body>

SetupUser.aspx.cs

C#

1using System.Collections.Generic; 2using System.Linq; 3using System.Web; 4using System.Web.UI; 5using System.Web.UI.WebControls; 6using System.Drawing; 7using System.Diagnostics; 8 9public partial class Class1 : Page 10{ 11 protected void Page_Load(object sender, EventArgs e) { } 12 13 protected void Button1_Click(object sender, EventArgs e) 14 { 15 var param = DropDownList1.SelectedValue; 16 var proc = Process.Start("C:\test.exe", param); // Webサーバー内のexeを起動 17 if (proc == null) // エラーメッセージを画面に表示 18 Label1.Text = "エラーが発生しました。"; 19 else 20 { 21 proc.WaitForExit(); // プロセスが終了するのを待つ 22 23 var ecode = proc.ExitCode; // エラーコード取得 24 if (ecode == 0) // エラーコードが0なら正常終了 25 Label1.Text = "起動できた模様です。"; 26 else // それ以外なら簡単なエラーメッセージを表示 27 Label1.Text = $"以下のエラーコードが返送されました:{ecode}"; 28 } 29 } 30}

データベースから取得した情報をセレクトボックス形式で表示させ、その中から選択されたユーザー情報を用いて別のマシンを遠隔起動させます。「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;の箇所で何らかのエラーが発生しているのは素人目でもわかるのですが、これをどう解決したらいいのか分かりません。どなたかご教示お願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

投稿2020/04/07 12:36

len_souko

総合スコア1363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.okuno

2020/04/08 00:53 編集

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

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 06:39

編集2020/04/07 06:44
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.okuno

2020/04/07 07:18 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問