Как получить ответ, ожидающий ответа на веб-запрос? - PullRequest
0 голосов
/ 19 февраля 2019

Я интегрирую приложение 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);

и он никогда не перешагивает код после него, пока он полностью не завершит процесс в веб-сервисе.

Что я должен добавить к коду, чтобы знать, что асинхронный запрос в настоящее время ожидает, чтобы я мог вызвать на экране уведомление, чтобы уведомить пользователя, чтобы подтвердить пин-код для оплаты на своем телефоне?

...