.NET WebAPI-SDK回调方法的返回响应

时间:2020-03-12 04:46:05

标签: c# .net asp.net-web-api2

一段时间以来,我一直在努力寻找解决方案,但是我已经呆了好几天了。非常感谢您的帮助。

我正在使用指纹扫描仪SDK,并尝试在其上编写Windows Service自托管WebAPI,以便可以从Web上使用它。

因此,我有一个WebAPI控制器,其中有下面的方法,该方法将从Web App中调用。

public async Task<IHttpActionResult> Enroll()
        {
            using (FM220 fp = new FM220())
            {
                await Task.Factory.StartNew(() =>
                {
                    fp.Initialize();
                    fp.Capture();

                    //How to get the Fingerprint data from ScanCompleteFM220()?

                    fp.Dispose();
                });

            }

            return Ok();
        }

问题是Capture()方法实际上是void方法,因为它不返回任何内容。这是Capture()

的签名
internal class FM220 : FM220_Scanner_Interface, IDisposable
{
    private FM220_SDK_Main sdk;
    private bool connected = false;

    public void Initialize()
    {
        sdk = new FM220_SDK_Main(this);
        FM220_Init_Result result = sdk.initFM220Scanner();

        if (result.getResult())
        {
            connected = true;
        }
    }

    public void Dispose()
    {
        sdk.unInitFM220();
        connected = false;
    }

    public void Capture()
    {
        if (connected)
        {
            //IntPtr refpntr = IntPtr.Zero;
            //sdk.CaptureFM220(ref refpntr);
            sdk.CaptureThreadProc();
        }
    }

    public void ScanCompleteFM220(FM220_Capture_Result result)
    {
        string fingerTemplate = string.Empty;
        string fingerQuality = string.Empty;
        string error = string.Empty;

        bool isCaptured = result.getResult();

        if (isCaptured)
        {
            fingerTemplate = Convert.ToBase64String(result.getISO_Template());
            fingerQuality = result.getNFIQ().ToString();
        }
        else
        {
            error = result.getError();
        }
    }

    public bool MatchTemplate(ref byte[] fingerTemplate1, ref byte[] fingerTemplate2)
    {
        int[] score = sdk.matchFingerTamplates(ref fingerTemplate1, ref fingerTemplate2);
        if (score[0] == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    public void ScannerProgressFM220(bool DisplayText, string statusMessage)
    {

    }
}

您可以看到CaptureFM220中的CaptureThreadProc()Capture()不会返回任何内容。取而代之的是,一旦捕获到指纹,就会单独调用已实现的方法ScanCompleteFM220(FM220_Capture_Result result)

如您所见,我无法从ScanCompleteFM220致电Enroll()。相反,我需要一种从Enroll()调用ScanCompleteFM220的方法。这就是我所困扰和困惑的地方。

现在有关WebAPI,如果我正确理解了这一点,我有2种解决方法

  1. 让请求在Enroll()上等待(除非我返回响应,否则它将一直等待),直到我收到ScanCompleteFM220的响应并发送结果。但是如何?因为ScanCompleteFM220由系统自动调用。那么如何捕获响应?

  2. 除了保留请求之外,我还可以在Enroll()上使用回调函数,并在收到ScanCompleteFM220的响应后调用它。但是又如何?

请注意,FM220实现了FM220_Scanner_Interface,因此public void ScanCompleteFM220(FM220_Capture_Result result)是我为了接收结果而必须实现的方法。而且我无法更改方法签名。

0 个答案:

没有答案