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

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

ただいまの
回答率

90.51%

  • ASP.NET

    530questions

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

  • MVC

    224questions

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

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

解決済

回答 2

投稿

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

Yuki_S

score 314

前提・実現したいこと

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

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

発生している問題・エラーメッセージ

リリース版のHTMLソースを見てみると以下のようになっており、データが取得できていませんでした。

</form>
<form action="/CRM_sys/Account" class="form-inline" method="post">    <div class="col-lg-9 col-md-8 col-sm-12 col-xs-12">

        <table class="table">
            <tr>
                    <th>
                        社員番号
                    </th>
                    <th>
                        Admin
                    </th>
                    <th>
                        Visitor
                    </th>
                    <th>
                        User
                    </th>
                    <th>
                        Editor
                    </th>
            </tr>

        </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>
</form>

該当のソースコード

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>
}

コントローラー

        public ActionResult Index(string SearchStr)
        {
            DataTable tb = new DataTable();

            try
            {
                //権限情報をリスト化
                var Manager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new ApplicationDbContext()));
                //登録ユーザーのリスト化
                var models = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

                System.Type TpStr = typeof(string);
                System.Type Tpbool = typeof(bool);               

                //datatableのカラムを作成
                tb.Columns.Add(new DataColumn("社員番号", TpStr));

                foreach (ApplicationRole role in Manager.Roles)
                {
                    tb.Columns.Add(new DataColumn(role.Name, Tpbool));
                }

                //ユーザーごとにどの権限を持っているか確認
                foreach (var model in models.Users)
                {
                    var dr = tb.NewRow();
                    dr["社員番号"] = model.UsId;

                    foreach (ApplicationRole role in Manager.Roles)
                    {
                        var Usrole = role.Users.Select(a => a.UserId).ToList();

                        if (Usrole.Contains(model.Id.ToString()))
                        {
                            dr[role.Name] = true;
                        }
                        else
                        {
                            dr[role.Name] = false;
                        }
                    }

                    tb.Rows.Add(dr);

                }

            }
            catch (Exception ex)
            {
        //省略
            }

            return View(tb);
        }

試したこと

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

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

ASP.net MVC5

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/10/13 10:10

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

    キャンセル

  • Yuki_S

    2017/10/13 10:42

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

    キャンセル

  • SurferOnWww

    2017/10/13 10:45 編集

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

    キャンセル

回答 2

checkベストアンサー

+2

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

(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/16 11:02

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

    キャンセル

  • 2017/10/16 11:19

    結果の連絡をありがとうございました。

    > 結果としては、変わりませんでした。

    その意味は、開発マシンから運用環境の SQL Server に接続して試した結果、「リリース版として公開」の場合と同様にヘッダのみで中身が表示されないということと理解しています。

    開発マシンで容易にデバッグできる状況になっていると思いますので、コントローラーのコードのどこか適当な場所にブレークポイントを設けて、Manager.Roles や models.Users などにどのようなデータを取得できているかも調べてみてはいかがでしょう?

    キャンセル

  • 2017/10/16 11:56

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

    キャンセル

  • 2017/10/16 16:31

    SQLserverのAspNetUserRoleテーブルのうち1レコードでデータが欠損していたこと(暗号化によりランダムな文字列になっていた為気づきませんでした。。。)でユーザと役割の結合ができずに例外を起こしていました。アタッチ後、別の開発者がSQLserverのチェックをしていた際に編集をかけてしまっていたことがログからわかりました。

    また、別の原因も見つかりました。リリース版のWeb.configのdefaultconnectionを本番環境用に変更した際に、「MultipleActiveResultSets」の設定がされていなかった事も原因だったようです。

    非常に長い期間お付き合いいただきまして誠にありがとうございました。期待通りの動作するようになりました。

    キャンセル

  • 2017/10/16 16:53

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

    キャンセル

-1

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • ASP.NET

    530questions

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

  • MVC

    224questions

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