Чтение писем большого размера с использованием .NET api для Gmail - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь получить сообщение с помощью API Gmail.Я могу получать сообщения меньшего размера.Но при попытке получить сообщение большого размера выдается исключение «Задача была отменена».В соответствии с Google документация я пытался получить сообщение в формате RAW, а также в полном формате.Также я попытался с увеличенным временем ожидания для запроса.Но с тем же результатом.

Есть ли другой способ, с помощью которого я могу читать большие сообщения?

Вот мой пример кода:

try 
{
    GmailServiceObj = new GmailService(new BaseClientService.Initializer()
                                {
                                    ApplicationName = _appname,
                                    HttpClientInitializer = _userCredentials
                                }); 
    UsersResource.MessagesResource.GetRequest MessageGetRequestObj;
    MessageGetRequestObj= GmailServiceObj.Users.Messages.Get(UserEmailID, ItemID);        
    MessageGetRequestObj.Service.HttpClient.Timeout = new TimeSpan(0, 5, 0);        
    MessageGetRequestObj.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;        
    var _message = MessageGetRequestObj.Execute(); // throws exception
}
catch(Exception e)
{   //The request was aborted: The request was canceled.
    // trying to read same message in parts
    MessageGetRequestObj.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Full;
    var _message = MessageGetRequestObj.Execute();
    string res = Readparts(Emailobj.Payload.Parts, ItemID);

}

private String Readparts(IList<MessagePart> parts, string msgid)
{
    StringBuilder mime = new StringBuilder();
    try
    {
        foreach (var part in parts)
        {

            try
            {
                if (part != null && part.Body != null)
                    mime.Append(part.Body.Data);
                if (part.Body != null && part.Body.AttachmentId != null)
                {
                    var resource = GmailServiceObj.Users.Messages.Attachments.Get("me", msgid, part.Body.AttachmentId);
                    MessagePartBody attachPart = resource.Execute(); // Throws exception 

                    // Converting from RFC 4648 base64 to base64url encoding
                    // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history
                    String attachData = attachPart.Data.Replace('-', '+');
                    attachData = attachData.Replace('_', '/');
                    mime.Append(attachData);
                }
                if (part.Parts != null && part.Parts.Count > 0)
                {
                    mime.Append(Readparts(part.Parts, msgid));
                }
            }
            catch (Exception er) { }
        }
    }
    catch (Exception ex)
    {}
    return mime.ToString();
}

Заранее спасибо.

РЕДАКТИРОВАТЬ: полный журнал

----------------------------------------------------------------------------------------- ОСНОВНОЕ ИСКЛЮЧЕНИЕ ------------------------------------------------

Ошибка при копировании содержимого в поток.

в System.Net.Http.HttpContent.d__49.MoveNext () --- Конец трассировки стека из предыдущегоместо, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Net.Http.HttpClient ()--- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Google.Apis.Requests.ClientServiceRequest 1.<ExecuteUnparsedAsync>d__33.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Google.Apis.Requests.ClientServiceRequest 1.Execute ()

----------------------------------------------------------------------------------------- ВНУТРЕННЕЕ ИСКЛЮЧЕНИЕ ------------------------------------------------

Получено непредвиденное значение EOF или 0 байтов из транспортного потока.

в System.Net.GZipWrapperStream.EndRead (IAsyncResultasyncResult)
в System.IO.Stream. <> c.b__43_1 (поток Stream, IAsyncResult asyncResult) в System.Threading.Tasks.TaskFactory 1.FromAsyncTrimPromise 1.Complete (TInstance thisRef, Func`3 endMethod, IAsyncResult, IAsyncResult)Boolean требуется синхронизация) --- конец трассировки стека от предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача Task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification Task).IO.Stream.d__27.MoveNext () --- Конец трассировки стека из предыдущего местоположения, где исключение былоhrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Net.Http.StreamToStreamB__ (копия задачи>, копия_1> копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия>, копия1, копия, копирование, копирование, копия>, задача>, копия <>, копирование, копирование, копия>, задача>, копирование, копирование, копирование.Object innerSource) в System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke () в System.Threading.Tasks.Task.Execute () --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Net.Http.HttpContent.d__49.MoveNext ()

1 Ответ

0 голосов
/ 25 июня 2019
MessageGetRequestObj.Service.HttpClient.Timeout = new TimeSpan(0, 5, 0);

это, вероятно, ваша проблема.Похоже, вы устанавливаете свой HTTP-клиент на тайм-аут после 5 (секунд?) Бездействия.Вам следует либо значительно увеличить этот тайм-аут, либо полностью его отключить.

...