Фильтры .NET Web API 2 не работают в IIS 10 - PullRequest
0 голосов
/ 17 октября 2018

Я повторно использую некоторые фильтры, которые я использовал в нескольких других проектах .NET Web API, где они работали.По некоторым причинам у этого проекта есть некоторые проблемы с выполнением моих фильтров исключений, которые я использую, чтобы регистрировать и сообщать об ошибках.

Это работает Web API 2 с 4.7.1 в качестве целевой платформы.Он работает на Windows Server 2016 в IIS версии 10.

Странно то, что при локальной разработке эти фильтры работают точно так, как предполагалось, но когда я развертываю их на том же IIS на том же сервере, что и у нас, другойСайты Web API, работающие с подобной настройкой, похоже, не работают.

Моя регистрация конфигурации Web API: public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new {id = RouteParameter.Optional} ); config.Filters.Add(new UnhandledExceptionFilter()); config.Services.Replace(typeof(IExceptionLogger), new TraceExceptionLogger()); } } public class TraceExceptionLogger : ExceptionLogger { private readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);</p> <pre><code> public override void Log(ExceptionLoggerContext context) { using (SentrySdk.Init(ConfigurationManager.AppSettings["amb:sentry_dsn"])) { //ILog logger = LogManager.GetLogger(context.ExceptionContext.ActionContext.ControllerContext.Controller.GetType()); _log.Error(context.Exception); SentrySdk.CaptureException(context.Exception); //We can log this exception message to the file or database. var response = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent("An internal server error occurred."), ReasonPhrase = "Please contact Ambition's data team." }; context.Request.CreateResponse(response); } } } public class UnhandledExceptionFilter : ExceptionFilterAttribute { //private readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private readonly ILog _log = LogManager.GetLogger(typeof(UnhandledExceptionFilter)); public override void OnException(HttpActionExecutedContext actionExecutedContext) { _log.Error(actionExecutedContext.ActionContext.ActionDescriptor.ActionName, actionExecutedContext.Exception); using (SentrySdk.Init(ConfigurationManager.AppSettings["amb:sentry_dsn"])) { // ILog logger = LogManager.GetLogger(actionExecutedContext.ActionContext.ControllerContext.Controller.GetType()); _log.Error(actionExecutedContext.ActionContext.ActionDescriptor.ActionName, actionExecutedContext.Exception); SentrySdk.CaptureException(actionExecutedContext.Exception); //We can log this exception message to the file or database. var response = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent("An internal server error occurred."), ReasonPhrase = "Please contact Ambition's data team." }; actionExecutedContext.Response = response; } } }

и ИнтернетЗапуск API: public void Configuration (приложение IAppBuilder) {using (SentrySdk.Init (ConfigurationManager.AppSettings ["sentry_dsn"])) {log4net.Config.XmlConfigurator.Configure ();var logger = LogManager.GetLogger (typeof (Автозагрузка));logger.Info («Запуск бэкенда CSS»);

            try
            {
                var configuration = GlobalConfiguration.Configuration ?? new HttpConfiguration();

                // Enable CORS for SPA to work
                configuration.EnableCors();

                WebApiConfig.Register(GlobalConfiguration.Configuration);

                app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(GlobalConfiguration.DefaultServer);
                app.UseWebApi(GlobalConfiguration.DefaultServer);

                var fileSystemDirectory = ConfigurationManager.AppSettings["amb:spa_path"];

                try
                {
                    var physicalFileSystem = new PhysicalFileSystem(fileSystemDirectory);

                    var options = new FileServerOptions
                    {
                        EnableDefaultFiles = true,
                        FileSystem = physicalFileSystem,
                        StaticFileOptions =
                        {
                            FileSystem = physicalFileSystem,
                            ServeUnknownFileTypes = true,

                        },
                        DefaultFilesOptions =
                        {
                            DefaultFileNames = new[]
                            {
                                "index.html",
                                "favicon.ico",
                                "service-worker.js"
                            }
                        },
                        EnableDirectoryBrowsing = false
                    };

                    app.UseFileServer(options);
                    app.UseStageMarker(PipelineStage.MapHandler);
                }
                catch (Exception ex)
                {
                    logger.Error("Failed to set up static content server.", ex);
                }


                GlobalConfiguration.Configuration.EnsureInitialized();
            }
            catch (Exception ex)
            {
                logger.Error("Something went wrong during startup", ex);
            }
        }
    }
...