2016-01-29 10 views
6

ASP.NET 5/MVC 6プロジェクトでElmahを使用する方法について少し混乱します。私はnugetからパッケージを入手し、project.jsonの依存関係に"Elmah.Mvc": "2.1.2"を追加しました。ASP.NET 5/vNext/CoreでElmahを使用するにはどうすればよいですか?

ここからどこに行くのか分かりません - その日に戻って、nugetは今削除されたweb.configにエントリを追加します。そして、私は彼らのギブスや他の場所での例を見つけることができないようです。

シンプルなものがありませんか?

+0

すべてのパッケージがASP.NETコアと互換性があるように更新されているわけではありません。 ElmahとASP.NETスタックの間で必要とされる統合のレベルを考えると、Elmahはまだ更新されていないと言えます。 – mason

+0

[ELMAH on ASP.NET vNext?]の複製がありますか?(http://stackoverflow.com/questions/28907017/elmah-on-asp-net-vnext) – blowdart

答えて

10

ELMAHを使用する代わりに、エラーログを手動で実装することは難しくありません。このプロセスは、プロジェクトで発生したすべての例外をキャッチし、データベーステーブルに記録します。これを行うには、Startup.cs

でConfigureメソッドに以下を追加します
if (env.IsDevelopment()) 
    { 
    app.UseDeveloperExceptionPage(); 
    app.UseBrowserLink(); 
    } 
    else 
    { 
    app.UseExceptionHandler(builder => 
     { 
     builder.Run(async context => 
     { 
      context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; 
      context.Response.ContentType = "text/html"; 

      var error = context.Features.Get<Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature>(); 
      if (error != null) 
      { 
      LogException(error.Error, context); 
      await context.Response.WriteAsync("<h2>An error has occured in the website.</h2>").ConfigureAwait(false); 
      } 
     }); 
     }); 
    } 

同様Startup.csでこれを含める:あなたはあなたのデータベースにテーブルを作成する必要があります

private void LogException(Exception error, HttpContext context) 
{ 
    try 
    { 
    var connectionStr = Configuration["ConnectionString"]; 
    using (var connection = new System.Data.SqlClient.SqlConnection(connectionStr)) 
    { 
     var command = connection.CreateCommand(); 
     command.CommandText = @"INSERT INTO ErrorLog (Application, Host, Type, Source, Path, Method, Message, StackTrace, [User], WhenOccured) 
    VALUES (@Application, @Host, @Type, @Source, @Path, @Method, @Message, @StackTrace, @User, @WhenOccured)"; 
     connection.Open(); 

     if (error.InnerException != null) 
     error = error.InnerException; 

     command.Parameters.AddWithValue("@Application", this.GetType().Namespace); 
     command.Parameters.AddWithValue("@Host", Environment.MachineName); 
     command.Parameters.AddWithValue("@Type", error.GetType().FullName); 
     command.Parameters.AddWithValue("@Source", error.Source); 
     command.Parameters.AddWithValue("@Path", context.Request.Path.Value); 
     command.Parameters.AddWithValue("@Method", context.Request.Method); 
     command.Parameters.AddWithValue("@Message", error.Message); 
     command.Parameters.AddWithValue("@StackTrace", error.StackTrace); 
     var user = context.User.Identity?.Name; 
     if (user == null) 
     command.Parameters.AddWithValue("@User", DBNull.Value); 
     else 
     command.Parameters.AddWithValue("@User", user); 
     command.Parameters.AddWithValue("@WhenOccured", DateTime.Now); 

     command.ExecuteNonQuery(); 
    } 
    } 
    catch { } 
} 

注意をこの関数で使用される構造体を使用します。

+0

ええと、私は新しい例外を投げたときに発火しないようです...これがどうやって動作するのか理解していませんか? –

+0

ちょうど推測ですが、開発モードでこれを試しているからですか?その場合、LogExceptionを呼び出す代わりにWebページにエラーの詳細が表示されます。これは、最初のコードブロックのif文で変更できます。 – Rono

2

ELMAHはまだASP.NETコアをサポートするように更新されていません。 Atif Azis氏は、Bootstrapperと呼ばれるweb.config無料コンフィグレーションモジュールを構築しました。ブートストラップはASP.NET Coreをサポートしていません(私の知る限り)。しかし、RTMに近づくとすぐに、新しいバージョンをサポートする作業が始まると確信しています。

+0

私に尋ねると、 'Bootstrapper'は、使い慣れたJSとCSSライブラリがどのように分かっているかを示しています。 – ProfK

関連する問題