Я использую MSgraph для пакетирования около 97 000 элементов событий (в основном, для создания событий) в msgraph (только 10-15 элементов в каждом пакетном запросе), но он выдает периодически возникающие ошибки, когда я пытаюсь, и я получаю, «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, потому что подключенный хост не ответил» в моей программе C#.
Он успешно запускается и может получить в любом месте от 3000 элементов до 65 000 в партиях по 10-15 до того, как произойдет ошибка (обычно это будет ошибка где-то в диапазоне 17 000i sh).
Я не верю, что это пределы сервиса Outlook, как показано здесь https://docs.microsoft.com/en-us/graph/throttling#outlook -service-limit Поскольку программа находилась в спящем режиме 60 секунд для каждых 1000 индивидуальных запросов
Вот код, который я использую:
List<EventBatchDetail> EventDetailList; //list of events to be put into outlook
foreach (var batchRequestchunk in EventDetailList.ChunkBy(10))
{
var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) => {
requestMessage.Headers.Add("Authorization", token);
requestMessage.Headers.Add("Prefer", "outlook.timezone=\"Pacific/Auckland\"");
requestMessage.Headers.Add("Connection", "Keep-Alive");
return Task.FromResult(0);
}));
using (var batchRequest = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/$batch"))
{
BatchRequestContent batchRequestContent = new BatchRequestContent();
foreach (var batchRequestStep in batchRequestchunk)
{
batchRequestContent.AddBatchRequestStep(batchRequestStep.BatchRequest);
}
batchRequest.Content = batchRequestContent;
token = await StaticAzureToken.Token.GetToken();
await graphServiceClient.AuthenticationProvider.AuthenticateRequestAsync(batchRequest);
using (var httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 5, 0);
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
HttpResponseMessage batchResponse;
try
{
var tempthing = await httpClient.SendAsync(batchRequest);
batchResponse = tempthing;
//3. Process response
if (!batchResponse.IsSuccessStatusCode)
{
Console.WriteLine($"Bad batch responce code {batchResponse.StatusCode} {(int)batchResponse.StatusCode}");
}
var batchResponseContent = new BatchResponseContent(batchResponse);
var responses = await batchResponseContent.GetResponsesAsync();
string asdf = "";
foreach (var response in responses)
{
EventBatchDetail aaa = batchRequestchunk.Find(x => x.BatchRequest.RequestId.Equals(response.Key));
asdf = $"{aaa.Status}: {aaa.UserEmail} {aaa.Eventdetail.Subject} {aaa.Eventdetail.Start.DateTime} ID:{response.Key} Status:{(int)response.Value.StatusCode}";
if (response.Value.IsSuccessStatusCode)
{
Utils.LoggIt($"{asdf}", ConsoleColor.Green);
}
else
{
Utils.LoggIt($"{asdf}", ConsoleColor.Red);
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.StackTrace);
Console.WriteLine(ex.InnerException.ToString());
batchResponse = null;
}
}
}
}