一段时间以来,我一直在努力寻找解决方案,但是我已经呆了好几天了。非常感谢您的帮助。
我正在使用指纹扫描仪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种解决方法
让请求在Enroll()
上等待(除非我返回响应,否则它将一直等待),直到我收到ScanCompleteFM220
的响应并发送结果。但是如何?因为ScanCompleteFM220
由系统自动调用。那么如何捕获响应?
除了保留请求之外,我还可以在Enroll()
上使用回调函数,并在收到ScanCompleteFM220
的响应后调用它。但是又如何?
请注意,FM220
实现了FM220_Scanner_Interface
,因此public void ScanCompleteFM220(FM220_Capture_Result result)
是我为了接收结果而必须实现的方法。而且我无法更改方法签名。