【问题标题】:Microsoft Project Online OData asynchronous queryMicrosoft Project Online OData 异步查询
【发布时间】:2019-08-07 19:31:10
【问题描述】:

我正在尝试通过在 C# 中查询数据来使用 Microsoft Project OData。我遇到性能问题,每个查询延迟大约 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);

如果我“等待”第一个,然后执行第二个,它可以正常工作,但不能使用上面的代码。这是假设项目中有

谢谢,

【问题讨论】:

    标签: c# sharepoint sharepoint-online project-online


    【解决方案1】:

    根据以下帖子 Webrequest.Create 可能是问题所在,它使用了内部阻塞方法C# Thread UI is getting blocked | Possible reason 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();
                }
            }
        }
    

    【讨论】:

    • 嗨!我尝试使用您的代码,但我不断收到 401 UNAUTHORIZED 回复。我用我已经在使用的SharePointOnlineCredentials 替换了NetworkCredential,它给出了相同的结果。任何想法 ?谢谢!
    • 您好,我在添加表头时出错,已修复。
    • 我错过了“credential.GetAuthenticationCookie”。我在这里找到了一个半工作示例代码:code.msdn.microsoft.com/office/… 我仍然认为你的答案是已接受的,因为你在 HttpClient 轨道上发送给我。谢谢!
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多