C# stati c метод вызывается только при запуске - PullRequest
1 голос
/ 08 марта 2020

У меня есть метод 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;
}
...