HttpWebRequest ждет второго асинхронного ответа

Поэтому мне нужно получить два ответа на запрос. В документации от веб-сервиса, который мне нужно вызвать, говорится, что я получу быстрый синхронный ответ, а после этого он отправит мне медленный второй асинхронный ответ.

Мне это кажется очень странным, и я не могу заставить .NET ждать/прослушивать/опрашивать второй ответ.

Я получил следующее;

public void testCall(object sender, EventArgs e)
{
    byte[] xmlIn = Encoding.UTF8.GetBytes("my xml");

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my url");
    request.Method = "POST";
    request.ContentType = "application/xml";

    using (var dataStream = request.GetRequestStream())
    {
        dataStream.Write(xmlIn, 0, xmlIn.Length);
    }

    request.BeginGetResponse(new AsyncCallback(FinishWebRequest), request);
}

private void FinishWebRequest(IAsyncResult result)
{       
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;

    using (var stream = response.GetResponseStream())
    {
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        var responseString = reader.ReadToEnd();

        Debug.Write(responseString);
        Response.Write(responseString);
    }
}

Теперь это работает для первого ответа... но как мне получить второй ответ?


person Predders    schedule 26.08.2019    source источник
comment
Это был бы самый странный WebService, который я когда-либо видел. Можете ли вы сказать, какой это? Можете ли вы привести документы, где это указано? Я мог себе представить, что ответы быстрой синхронизации содержат ресурс для опроса результатов расчета. Но если это действительно так, как вы пишете, то это было бы... не знаю. Давайте заново изобретать колесо   -  person Fildor    schedule 26.08.2019
comment
@Fildor Да, действительно, это очень странно! А также у веб-сервиса есть только один метод для вызова. Первый результат действительно содержит идентификатор, но нет метода для вызова с этим идентификатором, для опроса или чего-то еще.   -  person Predders    schedule 27.08.2019
comment
Опять же, это общедоступный веб-сервис? Не могли бы вы рассказать нам, что это такое? Я не могу понять, кто-то действительно реализовал это так. Это означало бы, что вы не можете использовать какие-либо стандартные реализации. Вам придется спуститься на уровень TCP и самостоятельно все проанализировать. Все стандартные вещи HTTP, о которых я знаю, закроют соединение после получения ответа. Вот как это работает. Открыть, запросить, дождаться ответа, получить или тайм-аут, закрыть.   -  person Fildor    schedule 27.08.2019
comment
@Fildor, к сожалению, это не общедоступный веб-сервис. У меня есть документация, но я не знаю, как поделиться ею здесь.   -  person Predders    schedule 27.08.2019


Ответы (1)


вы должны знать, я не думаю, что http предназначен для этого варианта использования. Возможно, вы можете рассмотреть System.Net.Sockets. Но стоит попробовать использовать StreamReader, не удаляя его (избавьтесь от оператора using) и вручную закрывая его, когда вы хотите, выйдя из бесконечного цикла и вызвав StreamReader.Close().

И если вы идете по маршруту бесконечного цикла, рассмотрите порог тайм-аута и используйте отдельный поток.

person terrencep    schedule 26.08.2019