Похоже, что правильной терминологией является «Горячая замена модуля» (MHR - AKA «Живая перезагрузка» или «Горячие обновления / перезагрузка»). После этого ответа я получил часть пути:
https://stackoverflow.com/a/50934814/1236397
Отсутствующая часть была найдена здесь: https://github.com/aspnet/JavaScriptServices/issues/1654#issuecomment-430053872
Кажется, что обе эти ссылки предполагают, что шаблон Visual Studio создается в готовом для производства, а не в разработке. Две проблемы:
ClientApp\dist
может быть создана в какой-то момент, если вы создаете вне Visual Studio. Наличие созданной вручную папки dist
нарушит текущую перезагрузку. Эта папка должна быть полностью удалена. Для # 2 измените эти строки:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
...
public IConfiguration Configuration { get; }
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
...
}
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseSpaStaticFiles();
...
}
на эту:
public Startup(IHostingEnvironment env, IConfiguration configuration)
{
HostingEnvironment = env;
Configuration = configuration;
}
...
public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; }
...
public void ConfigureServices(IServiceCollection services)
{
...
if (HostingEnvironment.IsProduction())
{
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}
...
}
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
if (env.IsProduction())
{
app.UseSpaStaticFiles();
}
...
}
Однако на этом этапе страницы обновляются полностью. Это потому, что HMR не включен по умолчанию. Вам нужно будет следовать соответствующей документации здесь:
https://github.com/angular/angular-cli/wiki/stories-configure-hmr
Если ссылка вообще не работает, просто найдите документацию, используя запрос configure HMR for angular CLI
.
Подсказка: Если вам нужна поддержка IE9-11, взгляните на файл polyfills.ts
и игнорируйте строку import 'classlist.js'
, если она вам не нужна (в противном случае запустите npm install --save classlist.js
).
Я столкнулся с тем же поведением и решил его путем установки глобальной переменной прежде, чем назвать XmlConfigurator... Вот то, что я успешно использую:
детали log4net.config:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" />
...
</appender>
детали Global.asax:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax");
void Application_Start(object sender, EventArgs e)
{
// Set logfile name and application name variables
log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;
// Load log4net configuration
System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);
// Record application startup
log.Debug("Application startup");
}
Hope это помогает...
Регистратор был инициализирован через глобальный или основной метод в приложении? Могло случиться так, что GlobalContext не был, инициализируют все же.
Добавить тип = log4net.Util.PatternString
в элемент File
В JavaScript я переписываю каждую функцию так, чтобы она могла завершиться как можно скорее. Вы хотите, чтобы браузер снова контролировал вас, чтобы он мог вносить изменения в вашу DOM.
Каждый раз, когда мне хотелось спать в середине моей функции, я реорганизовывал использование setTimeout ()
.
] Я собираюсь отредактировать этот ответ, потому что я нашел его полезным:
Печально известная функция сна или задержки в любом языке очень обсуждается. Некоторые скажут, что всегда должен быть сигнал или обратный вызов для запуска данной функции, другие будут утверждать, что иногда полезен произвольный момент задержки. Я говорю, что у каждого свое, и одно правило никогда ничего не может диктовать в этой отрасли.
Написать функцию сна просто и сделать ее еще более удобной с помощью JavaScript Promises: а затем в Application_Start выполните:
void Application_Start(object sender, EventArgs e)
{
// Set logfile name and application name variables
log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;
// Load log4net configuration
System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);
//Get the loger
_pLog = log4net.LogManager.GetLogger("Global.asax");
// Record application startup
pLog .Debug("Application startup");
}
Итак, последовательность такова:
// Set logfile name and application name variables
// Load log4net configuration
// get the logger
// Record application startup