如何调试/修复Microsoft Face API项目牛津DetectAsync未完成请求

时间:2019-06-13 20:32:18

标签: c# microsoft-cognitive

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

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

  • 例外:null
  • 编号:643
  • 状态:WaitingForActivation
  • 结果:null(尚未计算)

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

我希望获得一个FaceIDs(GUIDS)数组。图像中每张脸一张。或错误消息。获得GUIDS之后,我可以尝试在personGroup中找到与面孔的匹配。如果找到匹配项,则将用户名返回我的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();
    }
....
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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

解决: 我需要解决的信息由Stephen Cleary在这篇文章中提供:How to call asynchronous method from synchronous method in 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
    }