У меня есть метод stati c, который вызывается где-то при запуске каждого метода WebApi (с использованием MVC core, проекта WebApi):
private static object syncObj = new object();
private static string myProp;
public static string MyStaticMethod()
{
lock (syncObj)
{
if (myProp == null)
{
myProp = Utils.GetMyPropFromRegistry();
if (string.IsNullOrWhiteSpace(myProp))
{
throw new MyException("myProp value not set");
}
}
}
return myProp;
}
Когда приложение запускается и первый раз это Метод вызван, я получаю исключение, так как у меня нет правильного значения, записанного в реестре (вызов Utils.GetMyPropFromRegistry возвращает ноль). Это все хорошо. Но если я добавлю значение в реестр, пока приложение все еще работает (в режиме отладки), этот метод больше не вызывается. Фактически он возвращает то же сообщение об исключении через WebApi, что и в первый раз, просто отладчик не останавливается ни на одной точке останова (что он делал при запуске приложения). Если я исследую трассировку стека, она правильно показывает, где произошло это исключение, просто не останавливается на достигнутом и не считывает новое значение из реестра.
Кажется, что C# (или ASP. NET Core), каким-то образом помнит, что метод генерирует исключение, и он даже не выполняет код?
Есть ли что-то особенное в методе stati c, который генерирует исключение при запуске? Или, может быть, это как-то связано с оператором блокировки? Я уже использовал методы stati c, но никогда не сталкивался с такой проблемой.
Места, где это называется:
// 1: Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication(ConfigureJwtBearerAuthenticationScheme)
.AddJwtBearer(options =>
{
var data = MyStaticMethod();
// Do something with data
});
}
// 2: WebApiController.cs:
public async Task<ActionResult<LoginResult>> Login(LoginModel model)
{
var data = MyStaticMethod();
var result = (do something with data)
return result;
}