none
ASP.NET MVC4 でクラスライブラリ内のトレースが表示されない RRS feed

  • 質問

  • ASP.NET MVC4 プロジェクトで、別の自家製クラスライブラリプロジェクトを追加しました。

    ASP.NET MVC4 プロジェクト内のコードで

    Trace.Write

    を記載すると、トレース情報に結果が残るのですが

    ASP.NET MVC4 プロジェクト内のコードから呼び出したクラスライブラリ内のコードに

    Trace.Write

    を記載しても、トレース情報に結果が残りません。

    クラスライブラリのapp.config のトレース関連の設定を、MVC4プロジェクトと同様に設定してみましたが、結果は変わりませんでした。

    クラスライブラリ内のトレースを有効にする方法をご教示いただきたく、よろしくお願いします。

    2015年4月3日 7:11

回答

  • 皆さんのメッセージを踏まえ、もう一度見直してみました。

    簡単なクラスライブラリを作りチェックしてみましたら、Trace出来ていました。

    どのようなケースでTrace出来ないのだろうと、再確認したところ、下記のようなケースで出来ていないことがわかりました。

            public async Task<ActionResult> Index()
            {
                Trace.WriteLine("Trace1");
                var i = Task.Factory.StartNew(async delegate
                {
                    Trace.WriteLine("Trace2");
                    await Task.Delay(1000);
                    return 1;
                });
                return View(await i);
            }

    このコードの場合だと、 Trace1 のみ Trace.axd にトレース情報が表示されます。

    Visual Studio の出力では、 Trace1 と Trace2 がトレース情報に表示されました。

    Trace.axd 等で表示させたいのですが、無理かもしれませんね。

    一旦クローズさせていただきます。

    皆さんありがとうございました。

    • 回答としてマーク CharAzurable 2015年4月6日 8:07
    2015年4月6日 8:07

すべての返信

  • クラスライブラリのapp.config のトレース関連の設定を、MVC4プロジェクトと同様に設定してみましたが、結果は変わりませんでした。

    クラスライブラリにapp.configを追加すると「プロジェクト名.dll.config」ファイルが生成されますが、実のところこのファイルは参照されていません。

    クラスライブラリであっても、アプリケーションであれば「アプリケーション.exe.config」をASP.NETであれば「web.config」を参照します。今回の場合は、クラスライブラリのapp.configに記載していた内容をweb.configに記載してください。

    2015年4月3日 7:31
  • 試してみましたが、残念ながらこちらの方法では解決されませんでした。
    2015年4月3日 9:09
  • まったく勘違いしていました。

    Trace.Write()に説明がありますが、通常はTraceクラスの静的メソッドWrite()を呼び出しますが、ASP.NETにおいてはPageクラスのTraceプロパティを参照しているため、全く別物となります。両者を統合するにはチュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合を参照してください。

    2015年4月3日 9:25
  • 私も上記のサイトを見て、System.Diagnostics.Trace.Write を使ってトレースを出力しています。

    ただ、上記のサイトの説明は、旧ASP.netを前提にしていて、MVC4+Razorのプロジェクトなので読み替えしながらやっています。

    1. <system.web> の trace enabled="true" に設定

    2. <system.diagnostics><trace><listeners>に"WebPageTraceListener"を追加

    をやってみました。

    2015年4月3日 10:03
  • どのようにしているのかよく分かりませんので確認させてください。

    > ASP.NET MVC4 プロジェクト内のコードから呼び出したクラスライブラリ内のコードに
    > Trace.Write
    > を記載しても、トレース情報に結果が残りません。

    一つのソリューションの中に二つのプロジェクトがあって、一方が ASP.NET MVC4 の Web アプリ、他方がクラスライブラリ(参考にされている以下の記事で言うと AuthorClass.cs)という理解でいいのですか?

    チュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合
    https://msdn.microsoft.com/ja-jp/library/b0ectfxd(v=vs.100).aspx

    そして、AuthorClass.cs の中に、チュートリアルにあった以下のコードを書いても、その Trace メッセージが ASP.NET Web アプリにルーティングされない(ブラウザからトレースビューア Trace.axd を要求したとき表示される[トレース情報]に表示されない)と言ってますか?

    System.Diagnostics.Trace.Write("AuthorClass is created.", "AUTHORCLASS TRACE");
    System.Diagnostics.Trace.Write("GetAuthors called.","AUTHORCLASS TRACE");


    であれば、

    > 上記のサイトの説明は、旧ASP.netを前提にしていて、MVC4+Razorのプロジェクトなので読み替えしながらやっています。

    というところをもっと具体的に、どのように「読み替え」たのか書いていただけますか。今提供されている情報だけでは全く不足です。

    その際、ご自分の環境(OS, .NET, IIS, Visual Studio のバージョン、使用したテンプレート、ASP.NET 開発サーバー / IIS Express / IIS のどれで動かしているか、ブラウザは何かなど)も書いていただくようお願いします。


    ちなみに、自分の環境(Vista SP2, ASP.NET MVC4, VS2010 Professional, MVC4 インターネットアプリケーションテンプレートで作成、IIS7 統合パイプラインモード上で実行、ブラウザは IE9)で、上の URL のチュートリアルに準じて MVC4 アプリを作成して試してみましたが、トレースビューアの[トレース情報]には期待通り自分が設定した Trace メッセージが表示されることは確認できました。

    なので、やり方や環境の違いの問題だと思います。


    • 編集済み SurferOnWww 2015年4月6日 1:09 追記:IIS7 ⇒ IIS7 統合パイプラインモード、IE ⇒ IE9
    2015年4月5日 7:29
  • 皆さんのメッセージを踏まえ、もう一度見直してみました。

    簡単なクラスライブラリを作りチェックしてみましたら、Trace出来ていました。

    どのようなケースでTrace出来ないのだろうと、再確認したところ、下記のようなケースで出来ていないことがわかりました。

            public async Task<ActionResult> Index()
            {
                Trace.WriteLine("Trace1");
                var i = Task.Factory.StartNew(async delegate
                {
                    Trace.WriteLine("Trace2");
                    await Task.Delay(1000);
                    return 1;
                });
                return View(await i);
            }

    このコードの場合だと、 Trace1 のみ Trace.axd にトレース情報が表示されます。

    Visual Studio の出力では、 Trace1 と Trace2 がトレース情報に表示されました。

    Trace.axd 等で表示させたいのですが、無理かもしれませんね。

    一旦クローズさせていただきます。

    皆さんありがとうございました。

    • 回答としてマーク CharAzurable 2015年4月6日 8:07
    2015年4月6日 8:07
  • 問題は「クラスライブラリ内のトレースが表示されない」ということだったはずで、話が違ってきているような気がします。

    例として挙げられているのは、「クラスライブラリ」と言うよりはコントローラーの非同期アクションメソッドで、別スレッドで動く Trace のトレースメッセージという Trace.axd では見れない例をわざわざ探されたのではないですか?

    2015年4月6日 8:54
  • 当初のクラスライブラリの中身の全てが上記のようなコードで動作していたので、全く気づきませんでした。

    2015年4月6日 9:26
  • 問題は「クラスライブラリ内のトレースが表示されない」ということだったはずで、話が違ってきているような気がします。

    例として挙げられているのは、「クラスライブラリ」と言うよりはコントローラーの非同期アクションメソッドで、別スレッドで動く Trace のトレースメッセージという Trace.axd では見れない例をわざわざ探されたのではないですか?

    最初から原因がわかるなら質問していないと思います。

    クラスライブラリから出力できていなかったというのが最初は表面上見えていた話でしょう。

    もちろん後で試したようなことを最初にやれば気づいたということではありますが、あんまりそこをせめても建設的ではないと思います。

    --追記
    言い忘れましたが、気になったのは、なんかわざわざ悪意でもあったかのように書いているところです…
    • 編集済み なちゃ 2015年4月7日 5:34
    2015年4月7日 5:31