Как использовать WebRequest для стресс-тестирования веб-службы SOAP - PullRequest
0 голосов
/ 06 мая 2020

У меня нет опыта веб-программирования и асинхронных c запросов. Я написал приведенный ниже код на основе примеров Microsoft. NET do c. Цель этого кода - нагрузить веб-службу SOAP и получить показатели того, сколько одновременных запросов она может поддерживать. Я запускаю этот код в нескольких потоках одновременно. Проблема в том, что когда один из потоков достигает webRequest.BeginGetResponse(), он блокирует другие, пока этот вызов не будет завершен. Затем, когда этот вызов завершается в упомянутом потоке, второй поток случайным образом выполняет webRequest.BeginGetResponse(), блокируя другие, и так далее. Таким образом, цель нагрузки на веб-службу несколькими вызовами одновременно не достигается, потому что запросы выполняются последовательно.

Как мне изменить код для поддержки цели?

String foto_a = Imagenes[2 * id].imageBase64;
String foto_b = Imagenes[2 * id + 1].imageBase64;
if (foto_a != null && foto_b != null)
{
    XmlDocument soapEnvelopeXml = new XmlDocument();
    soapEnvelopeXml.LoadXml(String.Format(@"
    <soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" 
        xmlns:tem=""http://tempuri.org/"" 
        xmlns:ent=""http://schemas.datacontract.org/2004/07/API.Entities"">
        <soapenv:Header/>
        <soapenv:Body>
            <tem:Match>
                <tem:faceImageA><ent:Image>{0}</ent:Image></tem:faceImageA>
                <tem:faceImageB><ent:Image>{1}</ent:Image></tem:faceImageB>
            </tem:Match>
        </soapenv:Body>
    </soapenv:Envelope>
    ", foto_a, foto_b));

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);

    webRequest.Headers.Add("SOAPAction", _action);
    webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(
        ASCIIEncoding.ASCII.GetBytes(username + ":" + password)));
    webRequest.ContentType = "text/xml;charset=UTF-8";
    webRequest.Accept = "text/xml";
    webRequest.Method = "POST";
    webRequest.ProtocolVersion = HttpVersion.Version11;

    using (Stream stream = webRequest.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }

    DateTime timer = DateTime.Now;

    // begin async call to web request.
    IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

    // suspend this thread until call is complete. You might want to
    // do something usefull here like update your UI.
    asyncResult.AsyncWaitHandle.WaitOne();

    // get the response from the completed web request.
    WebResponse webResponse = webRequest.EndGetResponse(asyncResult);

    DateTime elapsed = DateTime.Now.Subtract(timer).TotalMilliseconds;

    // Process web response
}
...