pascx64
pascx64

Reputation: 984

Microsoft Project Online OData asynchronous query

I am trying to use Microsoft Project OData by querying data in C#. I am having performances issues with delays around 1s for each query. I am trying to query 2 information at once using that method :

    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;
        }
    }

It works fine if I call it and always wait for it to end before calling it again, but I never receive any response from the WebRequest if I call it multiple times at once :

// 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);

If I "await" the first one and then do the second one it works fine, but not with the code above. And this is assuming there is < 300 tasks in the project, if more than that I have to query them in chunk of 300 leading to 4 or 5 seconds for the entire query since I can't to them all at once! Is there a way to send multiple request at the same time ? I am able to do it by simply entering the url in multiple chrome tabs really fast / have faster responses. I don't understand why it doesn't work with my code!

Thanks,

Upvotes: 0

Views: 979

Answers (1)

vdL
vdL

Reputation: 277

According to the following post Webrequest.Create could be the problem, it uses an internally blocking method C# Thread UI is getting blocked | Possible reason WebRequest.Create?.

The code below uses the newer HttpClient and shouldn't have this issue.

    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();
            }
        }
    }

Upvotes: 1

Related Questions