Я повторно использую некоторые фильтры, которые я использовал в нескольких других проектах .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);
}
}
}