从Azure计算机视觉API提取文本时出错

时间:2019-11-07 17:47:29

标签: c# asp.net azure api

我正在测试Azure计算机视觉API,以尝试从本地.jpg文件提取手写文本。我正在关注以下示例:https://docs.microsoft.com/en-us/azure/cognitive-services/computer-vision/quickstarts-sdk/csharp-sdk

不幸的是,当我运行代码时,我抛出了一个异常:System.AggregateException: "this.Endpoint" cannot be null

Text

我目前的测试代码:

class Program
    {
        static string subscriptionKey = Environment.GetEnvironmentVariable("{SUBSCRIPTION-KEY}");
        static string endpoint = Environment.GetEnvironmentVariable("https://{MY-ENDPOINT}.cognitiveservices.azure.com/");

        private const string EXTRACT_TEXT_LOCAL_IMAGE = "vision3.jpg";

        public static ComputerVisionClient Authenticate(string endpoint, string key)
        {
            ComputerVisionClient client =
                new ComputerVisionClient(new ApiKeyServiceClientCredentials(key))
                { Endpoint = endpoint };
            return client;
        }


        static void Main()
        {
            Console.WriteLine("Azure Cognitive Services Computer Vision - .NET quickstart example");
            Console.WriteLine();

            ComputerVisionClient client = Authenticate(endpoint, subscriptionKey);

            //ExtractTextUrl(client, EXTRACT_TEXT_URL_IMAGE).Wait();
            ExtractTextLocal(client, EXTRACT_TEXT_LOCAL_IMAGE).Wait();


        }
        public static async Task ExtractTextLocal(ComputerVisionClient client, string localImage)
        {
            Console.WriteLine("----------------------------------------------------------");
            Console.WriteLine("EXTRACT TEXT - LOCAL IMAGE");
            Console.WriteLine();

            // Helps calucalte starting index to retrieve operation ID
            const int numberOfCharsInOperationId = 36;

            Console.WriteLine($"Extracting text from local image {Path.GetFileName(localImage)}...");
            Console.WriteLine();
            using (Stream imageStream = File.OpenRead(localImage))
            {
                // Read the text from the local image
                BatchReadFileInStreamHeaders localFileTextHeaders = await client.BatchReadFileInStreamAsync(imageStream);
                // Get the operation location (operation ID)
                string operationLocation = localFileTextHeaders.OperationLocation;

                // Retrieve the URI where the recognized text will be stored from the Operation-Location header.
                string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);

                // Extract text, wait for it to complete.
                int i = 0;
                int maxRetries = 10;
                ReadOperationResult results;
                do
                {
                    results = await client.GetReadOperationResultAsync(operationId);
                    Console.WriteLine("Server status: {0}, waiting {1} seconds...", results.Status, i);
                    await Task.Delay(1000);
                    if (maxRetries == 9)
                    {
                        Console.WriteLine("Server timed out.");
                    }
                }
                while ((results.Status == TextOperationStatusCodes.Running ||
                        results.Status == TextOperationStatusCodes.NotStarted) && i++ < maxRetries);

                // Display the found text.
                Console.WriteLine();
                var textRecognitionLocalFileResults = results.RecognitionResults;
                foreach (TextRecognitionResult recResult in textRecognitionLocalFileResults)
                {
                    foreach (Line line in recResult.Lines)
                    {
                        Console.WriteLine(line.Text);
                    }
                }
                Console.WriteLine();
            }
        }
    }

编辑:

从尝试调试开始,即使我立即将它们初始化,看起来subscriptionKey和终结点变量从一开始都是空的。为什么会这样?

Text

edit2:

当我在Main()中硬编码subscriptionKey和终结点时:

ComputerVisionClient client = Authenticate("https://{END-POINT}.cognitiveservices.azure.com/", "{SUBSCRIPTION-KEY}");

工作正常。谁能告诉我为什么我的2个静态字符串变量不起作用?因为我不想对这些变量进行硬编码

3 个答案:

答案 0 :(得分:1)

不确定要这两行完成什么-

static string subscriptionKey = Environment.GetEnvironmentVariable("{SUBSCRIPTION-KEY}");
static string endpoint = Environment.GetEnvironmentVariable("https://{MY-ENDPOINT}.cognitiveservices.azure.com/");

您要么获取环境变量,要么分配字符串文字,您正试图...将两者结合起来?

也许可以从appsettings.json读那些秘密。

答案 1 :(得分:1)

这是供将来关注本教程并像我一样停留在环境变量上的人使用,以便从Visual Studio中添加新变量转到您的项目属性>>调试

然后添加提供给您的新键和值check here to see image explanation

答案 2 :(得分:0)

在将请求发送到API或开始执行代码之前,请尝试添加以下代码。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
相关问题