Консольное приложение C # неожиданно закрывается - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь запрограммировать базовый метод аутентификации для консольного приложения, однако, похоже, он неожиданно закрывается при вводе.

Пример кода -

    private static async Task Auth()
    {
        try
        {

            Console.WriteLine("Verify authentication");
            Console.WriteLine("Enter your 6 digit code: ");
            string AuthenticationKey = Console.ReadLine();

            if (AuthenticationKey != "")
            {

                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.GetAsync("http://www.anysiteexample.com"))
                    {
                        using (HttpContent content = response.Content)
                        {

                            string result = await content.ReadAsStringAsync();

                            if(result.Contains(AuthenticationKey))
                            {

                                Console.WriteLine("Successfully validated credentials, starting program...");
                                Setup();

                            }
                            if(!result.Contains(AuthenticationKey))
                            {
                                Console.WriteLine("Failed");
                                await Auth();
                            }

                        }
                    }
                }

            }
            if (AuthenticationKey == "")
            {

                Console.WriteLine("Auth key is empty");
                await Auth();

            }
        }
        catch(Exception)
        {
            Console.WriteLine("Error raised closing application...");
            Thread.Sleep(5000);
            Environment.Exit(0);
        }
    }

если я ничего не введу в Console.ReadLine (), тогда он успешно выполнит оператор else, однако, если я введу что-либо буквенно-цифровое в Console.ReadLine (), он неожиданно закроется без исключения? В общем случае он должен обработать запрос httpclient, а затем любой из этих операторов if / else.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Я думаю, что было бы лучше избежать рекурсивных вызовов и просто иметь цикл while для проверки ввода ключа:

async void Auth()
{
    try
    {
        string authenticationKey = null;
        while(string.IsNullOrEmpty(authenticationKey))
        {
            Console.WriteLine("Verify authentication");
            Console.WriteLine("Enter your 6 digit code: ");
            authenticationKey = Console.ReadLine();

            if (string.IsNullOrEmpty(authenticationKey))
            {
                Console.WriteLine("Auth key is empty");
                continue;
            }

            if (!await IsAuthenticated(authenticationKey))
            {
                Console.WriteLine("Failed to validate credentials.");
                authenticationKey = null;
                continue;
            }

            break;
        }

        Console.WriteLine("Successfully validated credentials, starting program...");
        Setup();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error raised closing application: {ex.Message}");
        Thread.Sleep(5000);
        Environment.Exit(0);
    }
}

async Task<bool> IsAuthenticated(string key)
{
    if (string.IsNullOrEmpty(key))
        return false;

    using (HttpClient client = new HttpClient())
    using (HttpResponseMessage response = await client.GetAsync("http://www.authentication.com/example"))
    using (HttpContent content = response.Content)
    {
        string result = await content.ReadAsStringAsync();
        return result.Contains(key);
    }
}
1 голос
/ 05 июня 2019

Я не в курсе дела с новомодным async -без- Task (это вообще вещь? Думал, что это происходит в C # 8), но вы делаете рекурсивные вызовы Auth(), async операция, без ожидания, поэтому исходный поток завершается. Попробуйте дождаться этих рекурсивных вызовов (и верните Task, как сказал @zhulien, если это не какая-то новая функция)

Но на самом деле вы не должны делать рекурсивные вызовы здесь - вы должны вернуть false, возможно, с объяснением, и позволить вызывающему коду выполнить еще один вызов Auth(), если вы этого хотите.

...