SORU
1 Mart 2013, Cuma


Nasıl TÜM özel durumları genel# MVC4 C WebAPİ uygulaması için giriş yapabilirim?

Arka plan

Bir istemci için API Service Katmanı geliştiriyorum ve tüm hataları yakalamak günlük küresel talep edilmiştir.

Bilinmeyen bir nokta (ya da eylem) gibi bir şey kullanarak kolayca ELMAH tarafından işlenen ya da Global.asax böyle bir şey ekleyerek olsa da, yine de

   protected void Application_Error()
        {
            Exception unhandledException = Server.GetLastError();
           //do more stuff
        }

. . .yönlendirme için ilgili işlenmeyen bir hata günlüğe alamadım. Örneğin:

public class ReportController : ApiController
{
    public int test()
    {
        var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
        return foo;
    }
}

Ayrıca genel [HandleError] öznitelik bu filtre tarafından kayıt ayarı denedim:

filters.Add(new HandleErrorAttribute());

Ama bu aynı zamanda tüm hataları günlüğe kaydetmez.

Sorun/Soru

Onları nasıl giriş yapabilirsiniz, böylece yukarıda /test arama üretilen gibi hataları yakalamak mı? Bu cevap açık olmalı gibi görünüyor, ama şimdiye kadar aklıma gelen her şeyi denedim.

İdeal olarak, hata, isteyen kullanıcının IP adresi, Tarih, Saat, ve diğerleri gibi günlük bazı şeyler eklemek istiyorum. Ben de bir hata oluştuğunda e-posta destek personel için otomatik olarak mümkün olmak istiyorum. Tüm bu ben onlar ne zaman bu hataları yakalamak olabilir eğer sadece bunu yapabilirsiniz!

ÇÖZÜLDÜ!

Darin için teşekkürler, ben de kabul ettim kimin, bunu çözmem gerekiyor Dimitrov.WebAPİdeğildüzenli bir MVC denetleyicisi olarak aynı şekilde hataları işlemek.

Çalıştı:

1) ad için özel bir filtre Ekleyin:

public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is BusinessException)
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(context.Exception.Message),
                ReasonPhrase = "Exception"
            });

        }

        //Log Critical errors
        Debug.WriteLine(context.Exception);

        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent("An error occurred, please try again or contact the administrator."),
            ReasonPhrase = "Critical Exception"
        });
    }
}

2) filtre de genel olarak kayıt olurWebApiConfigsınıf:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
            config.Filters.Add(new ExceptionHandlingAttribute());
        }
    }

YAkayıt atlayın ve sadece [ExceptionHandling] öznitelik ile tek bir kumanda dekore edebilirsiniz.

CEVAP
21 Ocak 2014, Salı


Önceki cevaplara ek olarak.

Dün, ASP.NET Web API 2.1 oldu oficially released.
İstisnalar genel olarak işlemek için başka bir fırsat sunuyor.
Ayrıntılar sample 'de verilmiştir.

Kısaca, genel durum kaydediciler ve/veya küresel bir istisna işleyicisi (tek) ekleyin.
Yapılandırma için onları ekleyin:

public static void Register(HttpConfiguration config)
{
  config.MapHttpAttributeRoutes();

  // There can be multiple exception loggers.
  // (By default, no exception loggers are registered.)
  config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());

  // There must be exactly one exception handler.
  // (There is a default one that may be replaced.)
  config.Services.Replace(typeof(IExceptionHandler), new GenericTextExceptionHandler());
}

Ve onların gerçekleşme:

public class ElmahExceptionLogger : ExceptionLogger
{
  public override void Log(ExceptionLoggerContext context)
  {
    ...
  }
}

public class GenericTextExceptionHandler : ExceptionHandler
{
  public override void Handle(ExceptionHandlerContext context)
  {
    context.Result = new InternalServerErrorTextPlainResult(
      "An unhandled exception occurred; check the log for more information.",
      Encoding.UTF8,
      context.Request);
  }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bigky226

    bigky226

    11 HAZİRAN 2006
  • Caramella Girls

    Caramella Gi

    19 Mayıs 2008
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011