Я только недавно добавил проект AspNetCore к нашему программному обеспечению, который является не более чем небольшим сайтом MVC. Для размещения этого проекта я использую функции Microsoft.AspNetCore.Hosting
и Topshelf
для запуска хостинга в службе Windows.
Проблема в том, что я не могу получить отладочную информацию из процесса хостинга после его запуска в службе Windows. Обычно вся информация записывается на консоль, и, поскольку я использую собственную трассировку / регистрацию в нашем программном обеспечении, я хотел бы продолжать использовать ее, если это возможно, или, по крайней мере, сказать процессу хостинга просто переслать всю информацию на вызов метода нашей трассировки не пропустите ничего и внедрите в будущем один из распространенных регистраторов, таких как NLog.
Вот код для хостинга
public class Program
{
public static void Main(string[] args)
{
// Name of the executable
var nameOfExe = Process.GetCurrentProcess().MainModule.FileName;
// Path of the current executable
var pathToContentRoot = Path.GetDirectoryName(nameOfExe);
// Path of the www root for the static files
var pathToWebRoot = pathToContentRoot + @"\wwwroot";
IWebHost host = WebHost.CreateDefaultBuilder()
.UseKestrel()
.UseContentRoot(pathToContentRoot)
.UseIISIntegration()
.UseWebRoot(pathToWebRoot)
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.RunAsCustomService();
}
}
public static class WebHostServiceExtensions
{
public static void RunAsCustomService(this IWebHost host)
{
var webHostService = new Service(host);
ServiceBase.Run(webHostService);
}
}
public class Startup
{
public Startup(IHostingEnvironment env)
{
if(env.IsDevelopment())
{
env.ContentRootPath = env.ContentRootPath.Replace("Bin", @"Main");
env.ContentRootFileProvider = new PhysicalFileProvider(env.ContentRootPath);
env.WebRootPath = env.WebRootPath.Replace("Bin", @"Main");
env.WebRootFileProvider = new PhysicalFileProvider(env.WebRootPath);
}
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(500); });
// Add framework services.
services
.AddLocalization(options => options.ResourcesPath = "Resources")
.AddMvc().ConfigureApplicationPartManager(manager =>
{
var oldMetadataReferenceFeatureProvider = manager.FeatureProviders.First(f => f is MetadataReferenceFeatureProvider);
manager.FeatureProviders.Remove(oldMetadataReferenceFeatureProvider);
manager.FeatureProviders.Add(new ReferencesMetadataReferenceFeatureProvider());
})
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
services.AddSingleton<FFDModel>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.Configure<WebSettings>(Configuration.GetSection("ValidationFilters"));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseSession();
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("de-DE"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=FFD}/{action=Index}/{id?}");
});
}
}