Azure移动应用程序表控制器中的异常处理

时间:2017-05-30 06:22:38

标签: c# azure azure-mobile-services

我正在使用Azure移动应用程序表控制器。获取语​​法是

    public IQueryable<Employee> GetAllEmployee()
    {
        try
        {
        return Query();
        }
        catch(Exception ex)
        {
            throw;
        }
    }

现在的问题是,由于return方法是IQueryable,我无法捕获catch块中的异常,我理解IQueryable是针对来自客户端的不同请求(在我的情况下是android)。但是我想记录catch块中的错误。目前我的调试器永远不会陷入catch块。因为azure移动应用程序sdk处理异常并形成http异常,所有我能看到的是500异常。我想记录数据库中的错误,我该如何实现?

1 个答案:

答案 0 :(得分:1)

正如您所说,返回类型是IQueryable,因此您无法在GetAllEmployee方法中捕获异常。

这是一个解决方法。

我建议您使用web api global error handling来处理异常。更多详细信息,您可以参考此article及以下代码。

在Startup.MobileApp.cs中:

添加此课程:

  public class TraceSourceExceptionLogger : ExceptionLogger
    {
        private readonly TraceSource _traceSource;

        public TraceSourceExceptionLogger(TraceSource traceSource)
        {
            _traceSource = traceSource;
        }

        public override void Log(ExceptionLoggerContext context)
        {
            //in this method get the exception details and add it to the sql databse
            _traceSource.TraceEvent(TraceEventType.Error, 1,
                "Unhandled exception processing {0} for {1}: {2}",
                context.Request.Method,
                context.Request.RequestUri,
                context.Exception);
        }
    }

更改ConfigureMobileApp方法,如下所示:

  public static void ConfigureMobileApp(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            config.Services.Add(typeof(IExceptionLogger),
    new TraceSourceExceptionLogger(new
    TraceSource("MyTraceSource", SourceLevels.All)));


            new MobileAppConfiguration()
                .UseDefaultConfiguration()
                .ApplyTo(config);

            // Use Entity Framework Code First to create database tables based on your DbContext
            Database.SetInitializer(new MobileServiceInitializer());

            MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();

            if (string.IsNullOrEmpty(settings.HostName))
            {
                app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
                {
                    // This middleware is intended to be used locally for debugging. By default, HostName will
                    // only have a value when running in an App Service application.
                    SigningKey = ConfigurationManager.AppSettings["SigningKey"],
                    ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
                    ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
                    TokenHandler = config.GetAppServiceTokenHandler()
                });
            }

            app.UseWebApi(config);
        }