Microsoft Project Online OData 异步查询
Microsoft Project Online OData asynchronous query
我正在尝试通过在 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);
如果我 "await" 第一个然后再做第二个它工作正常,但不是上面的代码。这是假设项目中有 < 300 个任务,如果超过这个数量,我必须以 300 个为单位查询它们,导致整个查询需要 4 或 5 秒,因为我不能一次全部完成!
有没有办法同时发送多个请求?
我可以通过简单地在多个 chrome 选项卡中输入 url 来做到这一点,非常快/有更快的响应。我不明白为什么它不适用于我的代码!
谢谢,
根据以下 post 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();
}
}
}
我正在尝试通过在 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);
如果我 "await" 第一个然后再做第二个它工作正常,但不是上面的代码。这是假设项目中有 < 300 个任务,如果超过这个数量,我必须以 300 个为单位查询它们,导致整个查询需要 4 或 5 秒,因为我不能一次全部完成! 有没有办法同时发送多个请求? 我可以通过简单地在多个 chrome 选项卡中输入 url 来做到这一点,非常快/有更快的响应。我不明白为什么它不适用于我的代码!
谢谢,
根据以下 post 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();
}
}
}