如何调试/修复Microsoft人脸 API 项目牛津检测异步未完成请求



我正在实现面部识别功能。我可以上传一个人和一个图像,但是当我尝试发送图像进行比较时,DetectAsync 方法失败,没有错误消息。我不确定问题是否出在方法上(我已经在其他项目中成功实现了它),还是出在我通过javascript或其他东西发送网络摄像头/图像的方式上。

我正在使用javascript来检测网络摄像头上的人脸并拍照。图片被发送到转换为流并发送到检测异步(流)。它位于 try-catch 块中,但我没有得到异常,它只是返回到似乎冻结的 UI,我无法重新加载页面或导航到另一个页面。在快速监视窗口中,我键入faceServiceClient.DetectAsync(stream),然后强制执行,我得到以下内容:

  • 异常:空
  • 编号: 643
  • 状态:等待激活
  • 结果:空(尚未计算)

其他一些,但这些似乎是最相关的

我希望得到一个面孔ID(GUIDS)数组。图像中每张脸一个。或错误消息。获得 GUIDS 后,我可以尝试在我的角色组中找到与人脸的匹配项。如果我找到匹配项,我会将用户名返回到我的 UI。我已经让它在 MVC 应用程序中工作。这是一个 ASP.NET 应用程序。

法典:

public async Task<string> DoFacialRecognition(string image)
{
string response = "";
FaceServiceClient faceServiceClient = new FaceServiceClient(subscriptionKey);
try
{  
var imageToSend = ConvertBase64ToImage(image.Substring(22));
Stream stream = ConvertToStream(imageToSend, ImageFormat.Png);
var faces = await faceServiceClient.DetectAsync(stream, true, false);
var faceIds = faces.Select(face => face.FaceId).ToArray();
}
....
}

问题出在一个或多个线程上...我不确定技术性或术语,但我会尽我所能解释。这是一个对异步方法进行 ajax 调用的 aspx 页。这就是我期待的行为:
aspx-> ajax-> 异步方法 A-> 异步方法 B-> 回到 A-> 回到 ajax-> ajax 处理响应。

实际发生的情况:
aspx-> ajax-> 异步方法 A->异步方法 B->回到 ajax 或 aspx

但是 ajax 正在等待来自方法 A 的响应,因此它忽略了来自方法 B 的响应(无论如何可能甚至不是正确的格式)。该页面仍然处于"活动状态",但是当用户尝试执行任何操作时,服务器不会响应,因为方法 A 仍在等待来自 B 的响应并锁定代码。

如果您对线程和异步调用有更多了解,请随时纠正我的理解!

要解决: 我需要解决的信息由Stephen Cleary在这篇文章中提供:如何在C#中从同步方法调用异步方法?。

您需要从 Ajax 调用中"隐藏"异步方法。为此,Stephen有一个名为Nito.AsyncEx的nuget包。

然后序列如下所示:
aspx-> ajax->方法 A-> 异步方法 B-> 回到 A-> 回到 ajax-> ajax 处理响应。
请注意,方法 A 不再是异步的。

代码如下所示:

using Nito.AsyncEx;
[WebMethod]
public static string CheckImage(string image)
{
var result =  AsyncContext.Run(() => MyAsyncMethod(image));           
return result; 
}
private static async Task<string> MyAsyncMethod(string image)
{
//do async stuff
}

最新更新