Я интегрирую приложение Windows с шлюзом электронного кошелька.На определенном кошельке перед просмотром кодовой строки и QR-кода требуется пин-код.Это не было проблемой с ожиданием получения штрих-кода с телефона пользователя.
Но у меня возникла небольшая путаница при обработке КОГДА пин-код требуется для продолжения транзакции на телефоне, гдевеб-запрос ожидает, прежде чем он передаст ответ.
private static async Task<string> SOAPManual(string url, string action, string xmlEnvelope)
{
try
{
XmlDocument soapEnvelopeXml = CreateSoapEnvelope(xmlEnvelope);
LogEvents($"Creating soap envelope.", EventLogEntryType.Information);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
LogEvents($"Set security protocol.", EventLogEntryType.Information);
HttpWebRequest webRequest = CreateWebRequest(url, action, xmlEnvelope);
LogEvents($"Creating web request.", EventLogEntryType.Information);
InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
LogEvents($"Inserting envelope to web request.", EventLogEntryType.Information);
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
// TRY 1:
//while (asyncResult.IsCompleted != true)
//{
// OnHTTPSPosting?.Invoke("Validate pin on wallet application to proceed.");
//}
// TRY 2:
//int delaytime = 0;
//while (true)
//{
// if (asyncResult.AsyncWaitHandle.WaitOne(0))
// {
// break;
// }
// await Task.Delay(500);
// delaytime += 500;
// if (delaytime > 5000)
// {
// OnHTTPSPosting?.Invoke("Validate pin on wallet application to proceed.");
// }
//}
asyncResult.AsyncWaitHandle.WaitOne();
LogEvents($"Web request responding.", EventLogEntryType.Information);
string soapResult;
using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
{
LogEvents($"Retrieve web response.", EventLogEntryType.Information);
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
}
return FormatStringToXML(soapResult);
}
}
catch (Exception ex)
{
LogEvents($"Error conduct SOAP request. Ex-{ex.Message}", EventLogEntryType.Error);
OnHTTPSPosting?.Invoke("Unable to validate payment with merchant. ");
}
return string.Empty;
}
У меня есть попытка 2 подхода, но он фактически ожидает / зависает / ждет (исправьте меня, если моя фраза неверна) на
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
и он никогда не перешагивает код после него, пока он полностью не завершит процесс в веб-сервисе.
Что я должен добавить к коду, чтобы знать, что асинхронный запрос в настоящее время ожидает, чтобы я мог вызвать на экране уведомление, чтобы уведомить пользователя, чтобы подтвердить пин-код для оплаты на своем телефоне?