Асинхронный запрос Microsoft Project Online OData

Я пытаюсь использовать Microsoft Project OData, запрашивая данные на C#. У меня проблемы с производительностью с задержками около 1 с для каждого запроса. Я пытаюсь запросить 2 информации одновременно, используя этот метод:

    public static async Task<string> ReadXml(string url)
    {
        var request = (HttpWebRequest)WebRequest.Create(url);

        request.Credentials = Credentials; // SharePointOnlineCredentials

        request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");

        using (var response = (HttpWebResponse)await request.GetResponseAsync())
        using (var stream = response.GetResponseStream())
        using (var reader = new System.IO.StreamReader(stream))
        {
            var xml = await reader.ReadToEndAsync();

            return xml;
        }
    }

Он отлично работает, если я вызываю его и всегда жду его завершения, прежде чем вызывать его снова, но я никогда не получаю никакого ответа от WebRequest, если я вызываю его несколько раз одновременно:

// just an example. I usually put a condition to filter for the tasks of a single project
var query1 = ReadXml(@"https://something.sharepoint.com/sites/pwa/_api/ProjectData/Projects");
var query2 = ReadXml(@"https://something.sharepoint.com/sites/pwa/_api/ProjectData/Tasks");
Task.WaitAll(query1, query2);

Если я «жду» первого, а затем делаю второй, он работает нормально, но не с кодом выше. И это при условии, что в проекте ‹ 300 задач, если больше, я должен запрашивать их порциями по 300, что приводит к 4 или 5 секундам для всего запроса, поскольку я не могу выполнить их все сразу! Есть ли способ отправить несколько запросов одновременно? Я могу сделать это, просто введя URL-адрес на нескольких вкладках Chrome очень быстро / получая более быстрые ответы. Я не понимаю, почему это не работает с моим кодом!

Спасибо,


person pascx64    schedule 07.08.2019    source источник


Ответы (1)


Согласно следующему сообщению Webrequest.Create может быть проблемой, он использует метод внутренней блокировки Пользовательский интерфейс C# Thread блокируется | Возможная причина WebRequest.Create?.

В приведенном ниже коде используется более новый HttpClient, и у него не должно быть этой проблемы.

    public static HttpClient _HttpClient { get; } = new HttpClient(new HttpClientHandler { Credentials=new NetworkCredential("","")});

    public static async Task<string> ReadXml(string url)
    {
        using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, url))
        {
            requestMessage.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
            using (var response = await _HttpClient.SendAsync(requestMessage))
            {
                return await response.Content.ReadAsStringAsync();
            }
        }
    }
person vdL    schedule 07.08.2019
comment
Привет! Я пытался использовать ваш код, но получаю 401 UNAUTHORIZED ответов. Я заменяю NetworkCredential на SharePointOnlineCredentials, который уже использовал, и это дает те же результаты. Есть идеи ? Спасибо! - person pascx64; 08.08.2019
comment
Привет, ошибся в добавлении шапки, исправил. - person vdL; 08.08.2019
comment
Мне не хватало credential.GetAuthenticationCookie. Я нашел полурабочий пример кода здесь: code.msdn. microsoft.com/office/ Я по-прежнему считаю ваш ответ принятым, поскольку вы отправили меня на трек HttpClient. Спасибо! - person pascx64; 08.08.2019