Как использовать Elmah.MVC с ApiController?

#c# #asp.net-mvc #elmah #elmah.mvc

#c# #asp.net-mvc #elmah #elmah.mvc

Вопрос:

Мне нужно регистрировать исключения из ApiController.

После установки Elmah.MVC я могу регистрировать ошибку 404 и другие в БД, но исключения в ApiController не отображаются в Elmah.

Есть идеи, как это исправить?

   <modules>
      <remove name="FormsAuthenticationModule" />
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>

  <elmah>
    <security allowRemoteAccess="yes" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="XXX"/>
  </elmah>



    public class StatusController : ApiController
{
    private StatusBLL statusBLL = new StatusBLL();

    // POST api/status
    public void Post(StatusDTO status)
    {
        throw new ArgumentException("test elmah here");
        if (!statusBLL.Register(status))
            helpers.BusinessLayer.CreateResponseApiMessage(statusBLL.Errors);   
    }
}
  

Комментарии:

1. Похожие tugberkugurlu.com/archive/asp-net-web-api-and-elmah-integration

Ответ №1:

Для этого есть пакет NuGet: http://www.nuget.org/packages/Elmah .Contrib.WebAPI /

После установки вам необходимо добавить новый глобальный фильтр, как описано здесь: http://blog.elmah.io/logging-to-elmah-io-from-web-api / (просто установите Elmah.Contrib.Пакет WebAPI без elmah.io ).

Ответ №2:

Я решил свою проблему, создав пользовательский атрибут для Elmah и добавив его в Global.asax.cs

 public class ElmahErrorAttribute : ExceptionFilterAttribute
{
    public override void OnException(
        System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
    {

        if (actionExecutedContext.Exception != null)
            Elmah.ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);

        base.OnException(actionExecutedContext);
    }
}


public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register); // WebApi
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Configure(System.Web.Http.GlobalConfiguration.Configuration);
    }
    private void Configure(HttpConfiguration httpConfiguration)
    {
        httpConfiguration.Filters.Add(
            new ElmahErrorAttribute()
        );

    }
}
  

Комментарии:

1. У вас уже есть атрибут HandleErrorAttribute, зарегистрированный в глобальных фильтрах?