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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

Q&A

解決済

2回答

3982閲覧

ASP.net MVC5でデバッグ時に表示されているものがリリース時に表示されない

Yuki_S

総合スコア356

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

0グッド

0クリップ

投稿2017/10/12 02:42

###前提・実現したいこと
ASP.netで各アカウントに対してどの権限を付与するかを設定できるページを作成しており、
デバッグ環境では以下のように表示されて問題なく権限の変更も行えていたのですが、
デバッグ時
リリース版として公開を行って最終チェックを行った所、データの取得ができていないのか、
以下のように空のテーブルが表示されてしまいました。
リリース時
この原因が、全く分かりません。
また、Webの開発が初めてなのでリリース版のデバッグのやり方も分からず途方に暮れている状況です。

丸投げの様な質問になって申し訳ないのですが、表示する為のクリティカルな解決方法。
または、HttpResponseでどんな情報を取得しているかを確認する方法を知りたいです。

###発生している問題・エラーメッセージ
リリース版のHTMLソースを見てみると以下のようになっており、データが取得できていませんでした。

HTML

1</form> 2<form action="/CRM_sys/Account" class="form-inline" method="post"> <div class="col-lg-9 col-md-8 col-sm-12 col-xs-12"> 3 4 <table class="table"> 5 <tr> 6 <th> 7 社員番号 8 </th> 9 <th> 10 Admin 11 </th> 12 <th> 13 Visitor 14 </th> 15 <th> 16 User 17 </th> 18 <th> 19 Editor 20 </th> 21 </tr> 22 23 </table> 24 25 </div> 26 <div class="col-lg-offset-3 col-lg-9 col-md-offset-4 col-md-8 col-sm-12 col-xs-12"> 27 <div style="text-align:center"> 28 <input type="submit" class="btn btn-default" value="登録" /> 29 </div> 30 </div> 31</form> 32

###該当のソースコード
ControllerでDatatableを作成して、Viewに渡し、以下コード中央部の
for (var i = 0; i < count; i++)内でチェックボックスの表示を行っています。

View

@using (Html.BeginForm("Index", "Account", FormMethod.Post, new { @class = "form-inline" })) { <div class="col-lg-9 col-md-8 col-sm-12 col-xs-12"> <table class="table"> <tr> @foreach (var item in Model.Columns) { <th> @item.Caption </th> } </tr> @foreach (System.Data.DataRow item in Model.Rows) { var key = String.Format("list[{0}].", memberCount); <tr> @{ count = item.ItemArray.Count(); } @for (var i = 0; i < count; i++) { <td> @if (item.ItemArray[i].GetType() == typeof(string)) { @Html.Label((string)item.ItemArray[i]) @Html.Hidden(key + "Name", (string)item.ItemArray[i]) } else { @Html.CheckBox(key + (string)Model.Columns[i].Caption, (bool)item.ItemArray[i]) } </td> } </tr> memberCount++; } </table> </div> <div class="col-lg-offset-3 col-lg-9 col-md-offset-4 col-md-8 col-sm-12 col-xs-12"> <div style="text-align:center"> <input type="submit" class="btn btn-default" value="登録" /> </div> </div> }

コントローラー

C#

1 public ActionResult Index(string SearchStr) 2 { 3 DataTable tb = new DataTable(); 4 5 try 6 { 7 //権限情報をリスト化 8 var Manager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new ApplicationDbContext())); 9 //登録ユーザーのリスト化 10 var models = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 11 12 System.Type TpStr = typeof(string); 13 System.Type Tpbool = typeof(bool); 14 15 //datatableのカラムを作成 16 tb.Columns.Add(new DataColumn("社員番号", TpStr)); 17 18 foreach (ApplicationRole role in Manager.Roles) 19 { 20 tb.Columns.Add(new DataColumn(role.Name, Tpbool)); 21 } 22 23 //ユーザーごとにどの権限を持っているか確認 24 foreach (var model in models.Users) 25 { 26 var dr = tb.NewRow(); 27 dr["社員番号"] = model.UsId; 28 29 foreach (ApplicationRole role in Manager.Roles) 30 { 31 var Usrole = role.Users.Select(a => a.UserId).ToList(); 32 33 if (Usrole.Contains(model.Id.ToString())) 34 { 35 dr[role.Name] = true; 36 } 37 else 38 { 39 dr[role.Name] = false; 40 } 41 } 42 43 tb.Rows.Add(dr); 44 45 } 46 47 } 48 catch (Exception ex) 49 { 50        //省略 51 } 52 53 return View(tb); 54 } 55

###試したこと
ASP.netでの開発が初めてでデバッグ環境での動作確認しか行えていません。

###補足情報(言語/FW/ツール等のバージョンなど)
ASP.net MVC5

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/12 03:14

認証方式は何ですか? 「デバッグ環境」と「リリース版として公開」の環境の違いを具体的に書いてください。(←言ってる意味が分かりますか? 分からなければ聞いてくださいね)
Yuki_S

2017/10/12 03:54

デバッグ環境はVisualStudioからIEをエミュレータに行っており、リリース版の公開はWindowsサーバのIISに立てました、ともにサーバはSQLserver2012を使っていますが、こういう事で合ってますか?あっていれば質問側に加筆します。間違っている場合は分からないので教えていただければと思います。
退会済みユーザー

退会済みユーザー

2017/10/12 05:43

認証方式は ASP.NET Identity ベースのフォーム認証(Visual Studio で「個別のユーザーアカウント」を選択)ですか?
退会済みユーザー

退会済みユーザー

2017/10/12 05:45 編集

> デバッグ環境はVisualStudioからIEをエミュレータに行っており ← ちょっと意味が分かりません。Visual Studio 2015 のテンプレートを利用してデフォルトで MVC アプリを作って、[デバッグの開始(S)]または[デバッグなしで開始(H)]で実行すると、Web サーバーとして IIS Express が立ち上がって web アプリが実行され、ブラウザ(デフォルトで IE)に表示されますが、そういうことですか? また、デフォルトでは認証方式は ASP.NET Identity ベースのフォーム認証となり、ユーザー情報のストアは Entity Framework Code First の機能を利用して LocalDB に作られますが、そうなんですか?
退会済みユーザー

退会済みユーザー

2017/10/12 05:46

> リリース版の公開はWindowsサーバのIISに立てました ← IIS では LocalDB は使えないのですが、そこはどうしましたか? (SQL Server にアクセスが必要でないページは問題なく表示されるのですか? ログインはできるのですか?)
Yuki_S

2017/10/12 06:05 編集

Visual Studio 2015 のテンプレートを利用してデフォルトで MVC アプリを作って、・・・に表示されますが、そういうことですか?←すみません、そういうことです。
Yuki_S

2017/10/12 06:12

SQL Serverにアクセスが必要でないページは問題なく表示されるのですか?ログインはできるのですか?←こちらについてはどちらも問題なく動作しています。
Yuki_S

2017/10/12 06:19

また、デフォルトでは認証方式は ASP.NET Identity ベースのフォーム認証となり、ユーザー情報のストアは Entity Framework Code First の機能を利用して LocalDB に作られますが、そうなんですか?←ここをあまり正しく理解できていないかもしれませんが、SQLserverに自分でデータベースを立てて、Web.configのdefaultconnectionをLocalDBから自分でたてたserverにかえたのでLocalDBではないと思います。間違っていたらすいません。
退会済みユーザー

退会済みユーザー

2017/10/12 06:20

先の質問「IIS では LocalDB は使えないのですが、そこはどうしましたか?」に答えてもらってないのですが・・・ LocalDB ではなくて、ちゃんと SQL Server を立てて、運用環境の Web サーバーから SQL Server にアクセスできるようにしたと理解していいですか? (それができる人がどうしてこういう初歩的な質問をするのか解せません。どうなっているのでしょう?)
退会済みユーザー

退会済みユーザー

2017/10/12 06:22

上の理解が合っていて、運用環境でログインできるというのであれば、ロール情報が運用環境の SQL Server にないということぐらいしか思い当たりませんが、そこは確認されているでしょうか?
Yuki_S

2017/10/13 00:04

運用環境でログインできるというのであれば、ロール情報が運用環境の SQL Server にないということぐらいしか思い当たりませんが、そこは確認されているでしょうか?←確認しましたが問題なくロール情報入っていました。
退会済みユーザー

退会済みユーザー

2017/10/13 01:10

> 確認しましたが問題なくロール情報入っていました。← どのように確認したのか不明ですが、DB の内容はホントに全く同一なのでしょうか? 開発マシンのプロジェクトの App_Data フォルダに LocalDB が生成した .mdf ファイルがあるはずですが、それを SQL Server の Data フォルダにコピーしてアタッチするというような、完全に同一であることを保証できるような作業をされたのでしょうか? 開発マシンの web アプリから SQL Server に接続してどのような結果になるか試してみてはいかがですか?
Yuki_S

2017/10/13 01:42

その通りです。まるまるmdfをコピーしてアタッチしております(その上で目視ではありますがプロパティの情報及びレコードについても確認いたしました)。開発マシンのWEBアプリからSQLserverに接続してのチェックやってみます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/10/13 01:45 編集

だとすると、今こちら(ここに書いてあること以外は何も知り得ない第三者)から見えている「デバッグ環境」と「リリース版として公開」の違いからは原因が分かりません。今までの話をまとめて回答欄に書いておきます。
guest

回答2

0

ベストアンサー

今こちら(ここに書いてあること以外は何も知り得ない第三者)から見えている「デバッグ環境」と「リリース版として公開」の違いは:

(1) デバッグ環境

Visual Studio のテンプレートを利用してデフォルトで MVC アプリを作った。

[デバッグの開始(S)]または[デバッグなしで開始(H)]で実行すると、Web サーバーとして IIS Express が立ち上がって web アプリが実行され、質問にアップした上の画像の通り、期待した結果がブラウザ(IE)に表示される。

認証方式は ASP.NET Identity ベースのフォーム認証で、ユーザー情報のストアは Entity Framework Code First の機能を利用して LocalDB に作られている。

(2) リリース版として公開

上記「デバッグ環境」でビルドした web アプリを Windows Server の IIS で運用。LocalDB に代えて SQL Server 2012 を利用。

質問にアップした下の画像のように、ヘッダのみで中身が表示されない。

なお、SQL Server にアクセスが必要でないページは問題なく表示される。ログインはできる。(ログインできるというのがちょっと疑わしいですが間違いないですか?)

・・・と理解しています。間違っていたら指摘してください。

「デバッグ環境」と「リリース版として公開」の違いは、簡単に言うと、ワーカープロセスのアカウントと LocalDB / SQL Server だけしか当方からは見えません。

最初はその違いが原因かと思いましたが、上の (2) に書いた状況を見ると、「リリース版として公開」でも Controller / Model / View のプログラムは期待通り動いていて、SQL Server の DB への接続・データの取得は問題ないように見えます。

質問にアップした下の画像の、ヘッダのみで中身が表示されないという結果から、コントローラーの、

//datatableのカラムを作成 tb.Columns.Add(new DataColumn("社員番号", TpStr)); foreach (ApplicationRole role in Manager.Roles) { tb.Columns.Add(new DataColumn(role.Name, Tpbool)); }

は期待通り動いていて、SQL Server の DB にアクセスしてロール名は取得できているが、

//ユーザーごとにどの権限を持っているか確認 foreach (var model in models.Users) { var dr = tb.NewRow(); // ・・・中略・・・ }

の、models.Users が空でループが回ってないように思えます。ということは、やはり SQL Server の DB の中身に問題がありそうな気がします。

とすると、問題は SQL Server の DB にデータがないということしか考えられないです。

【追伸】

開発マシンのWEBアプリからSQLserverに接続してのチェックやってみます。

結果の連絡をお待ちします。

結果が変わらなければ、SQL Server が怪しそう、期待通りの結果(開発環境と同様にユーザー情報も表示される)になれば「リリース版として公開」の web アプリが怪しそうという話になると思われます。

投稿2017/10/13 01:49

編集2017/10/13 02:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Yuki_S

2017/10/16 02:02

結果としては、変わりませんでした。現在SQLserverの立て直しを最終手段として検討しつつ、今一度各テーブル及びビュー等に細かい違いがないかを確認しています。
退会済みユーザー

退会済みユーザー

2017/10/16 02:19

結果の連絡をありがとうございました。 > 結果としては、変わりませんでした。 その意味は、開発マシンから運用環境の SQL Server に接続して試した結果、「リリース版として公開」の場合と同様にヘッダのみで中身が表示されないということと理解しています。 開発マシンで容易にデバッグできる状況になっていると思いますので、コントローラーのコードのどこか適当な場所にブレークポイントを設けて、Manager.Roles や models.Users などにどのようなデータを取得できているかも調べてみてはいかがでしょう?
Yuki_S

2017/10/16 02:56

そうですね!失念しておりました。そうしてみます!
Yuki_S

2017/10/16 07:31

SQLserverのAspNetUserRoleテーブルのうち1レコードでデータが欠損していたこと(暗号化によりランダムな文字列になっていた為気づきませんでした。。。)でユーザと役割の結合ができずに例外を起こしていました。アタッチ後、別の開発者がSQLserverのチェックをしていた際に編集をかけてしまっていたことがログからわかりました。 また、別の原因も見つかりました。リリース版のWeb.configのdefaultconnectionを本番環境用に変更した際に、「MultipleActiveResultSets」の設定がされていなかった事も原因だったようです。 非常に長い期間お付き合いいただきまして誠にありがとうございました。期待通りの動作するようになりました。
退会済みユーザー

退会済みユーザー

2017/10/16 07:53

情報(解決方法)の提供をありがとうございました。 解決できてよかったです。
guest

0

ASP.NETは以前に使ったきりで現役ではないのもあって、正確なアドバイスはできないのですが、
基本的にはやはり、出力されるHTMLのページにResponse.Writeでデバッグ情報を混ぜるとか、
TraceListenerを利用してログファイルへ出力するようにするとか、場合によってはIIS上で
動作しているプロセスへアタッチしてデバッグするようなことになるかと思います。

ASP.NET Web アプリケーションをデバッグする方法
チュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合
実行中のプロセスへのアタッチ
※日本語のページは自動翻訳を使っているのか、読みにくいです。VB.NETの例であったり、
情報が若干古かったりしますのでご注意ください。

たとえReleaseビルドでも設定ファイルの指定で有益なデバッグ用の情報がログに
出力できるようにしておいた方が、今後の運用時の障害対応に役立つと思います。

とりあえず、上記の方法を使ってデータベースからクエリーでN件のユーザー権限情報を
取り出しているはずのコードから確認していくことになるでしょうか。

投稿2017/10/12 14:51

編集2017/10/12 14:56
dodox86

総合スコア9183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問