static HttpHandlerFactory()
{
try
{
#if !NETSTANDARD1_6
//MONO doesn't implement this property
var pi = typeof(HttpRuntime).GetProperty("UsingIntegratedPipeline");
if (pi != null)
{
IsIntegratedPipeline = (bool)pi.GetGetMethod().Invoke(null, TypeConstants.EmptyObjectArray);
}
#endif
var appHost = HostContext.AppHost;
var config = appHost.Config;
var isAspNetHost = HostContext.IsAspNetHost;
WebHostPhysicalPath = appHost.VirtualFileSources.RootDirectory.RealPath;
HostAutoRedirectsDirs = isAspNetHost && !Env.IsMono;
//Apache+mod_mono treats path="servicestack*" as path="*" so takes over root path, so we need to serve matching resources
var hostedAtRootPath = config.HandlerFactoryPath == null;
//DefaultHttpHandler not supported in IntegratedPipeline mode
if (!IsIntegratedPipeline && isAspNetHost && !hostedAtRootPath && !Env.IsMono)
DefaultHttpHandler = new DefaultHttpHandler();
var rootFiles = appHost.VirtualFileSources.GetRootFiles().ToList();
foreach (var file in rootFiles)
{
var fileNameLower = file.Name.ToLower();
if (DefaultRootFileName == null && config.DefaultDocuments.Contains(fileNameLower))
{
//Can't serve Default.aspx pages so ignore and allow for next default document
if (!fileNameLower.EndsWith(".aspx"))
{
DefaultRootFileName = fileNameLower;
StaticFileHandler.SetDefaultFile(file.VirtualPath, file.ReadAllBytes(), file.LastModified);
if (DefaultHttpHandler == null)
DefaultHttpHandler = new StaticFileHandler(file);
}
}
WebHostRootFileNames.Add(fileNameLower);
}
foreach (var dir in appHost.VirtualFileSources.GetRootDirectories())
{
WebHostRootFileNames.Add(dir.Name.ToLower());
}
if (!string.IsNullOrEmpty(config.DefaultRedirectPath))
{
DefaultHttpHandler = new RedirectHttpHandler { RelativeUrl = config.DefaultRedirectPath };
NonRootModeDefaultHttpHandler = new RedirectHttpHandler { RelativeUrl = config.DefaultRedirectPath };
}
if (DefaultHttpHandler == null && !string.IsNullOrEmpty(config.MetadataRedirectPath))
{
DefaultHttpHandler = new RedirectHttpHandler { RelativeUrl = config.MetadataRedirectPath };
NonRootModeDefaultHttpHandler = new RedirectHttpHandler { RelativeUrl = config.MetadataRedirectPath };
}
if (DefaultHttpHandler == null)
DefaultHttpHandler = NotFoundHttpHandler;
var defaultRedirectHanlder = DefaultHttpHandler as RedirectHttpHandler;
var debugDefaultHandler = defaultRedirectHanlder != null
? defaultRedirectHanlder.RelativeUrl
: typeof(DefaultHttpHandler).GetOperationName();
SetApplicationBaseUrl(config.WebHostUrl);
ForbiddenHttpHandler = appHost.GetCustomErrorHttpHandler(HttpStatusCode.Forbidden);
if (ForbiddenHttpHandler == null)
{
ForbiddenHttpHandler = new ForbiddenHttpHandler
{
IsIntegratedPipeline = IsIntegratedPipeline,
WebHostPhysicalPath = WebHostPhysicalPath,
WebHostRootFileNames = WebHostRootFileNames,
WebHostUrl = config.WebHostUrl,
DefaultRootFileName = DefaultRootFileName,
DefaultHandler = debugDefaultHandler,
};
}
NotFoundHttpHandler = appHost.GetCustomErrorHttpHandler(HttpStatusCode.NotFound);
if (NotFoundHttpHandler == null)
{
NotFoundHttpHandler = new NotFoundHttpHandler
{
IsIntegratedPipeline = IsIntegratedPipeline,
WebHostPhysicalPath = WebHostPhysicalPath,
WebHostRootFileNames = WebHostRootFileNames,
WebHostUrl = config.WebHostUrl,
DefaultRootFileName = DefaultRootFileName,
DefaultHandler = debugDefaultHandler,
};
}
}
catch (Exception ex)
{
HostContext.AppHost.OnStartupException(ex);
}
}