这可能是由于我对 VSTO 插件缺乏了解,但我根本无法从应用程序内调用 Azure 文档智能调用。我制作了一个常规控制台应用程序,只是为了测试我的配置和密钥是否正常工作,并且我可以毫无问题地调用 API,只有当我尝试在我的 Addin 项目中使用它时才会出现这种情况。
using System;
using System.IO;
using System.Threading;
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
namespace ExcelAddIn
{
public partial class ThisAddIn
{
static string key2 = "KEY";
static string endpoint2 = "ENDPOINT";
static string imagepath = "Path on disk";
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//Authenticate
AzureKeyCredential credential = new AzureKeyCredential(key2);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint2), credential);
//Send file on local disk to OCR
LaunchOCR(client);
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
public void LaunchOCR(DocumentAnalysisClient c)
{
AnalyzeDocumentOperation operation = c.AnalyzeDocument(WaitUntil.Completed, "prebuilt-invoice", (Stream)File.Open(imagepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
AnalyzeResult result = operation.Value;
}
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
就像我说的,这种代码在插件之外运行良好,但它会抛出以下错误:https://pastebin.com/RE8QX0Us
我成功调用了一个简单的REST API,看看是否与Excel访问互联网有关,所以我真的不知道这是代码问题,网络问题,配置问题。我还确认插件加载正确,我使用 Microsoft 提供的示例在保存时创建一个新行,效果很好
该错误表明存在一些与网络相关的问题,但如果您的控制台应用程序运行在在 Excel 中产生错误的同一台计算机上,那么这不应该是问题。特别是因为您可以通过互联网拨打休息电话。
插件通常在单线程设备中运行,这可以影响异步操作。您可以尝试使用 Task.Run() 和 Wait() 让请求在单独的线程上运行。
public void LaunchOCR(DocumentAnalysisClient c)
{
try
{
Task.Run(() =>
{
AnalyzeDocumentOperation operation = c.AnalyzeDocument(WaitUntil.Completed, "prebuilt-invoice", (Stream)File.Open(imagepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
AnalyzeResult result = operation.Value;
}).Wait();
}
catch (AggregateException ae)
{
// Handle the AggregateException
ae.Handle((x) =>
{
if (x is RequestFailedException rfe)
{
System.Windows.Forms.MessageBox.Show($"Error analyzing document: {rfe.Message}");
return true;
}
// Handle other exceptions
System.Windows.Forms.MessageBox.Show($"An error occurred: {x.Message}");
return true;
});
}
}
我能想到的唯一一件事是,如果您的控制台应用程序附加到编译器(例如 Visual Studio),并且您以管理员身份运行,请尝试提升 Excel 以查看是否正在进行某些特权操作.