.NET Gmail Api。输入不是有效的base64

时间:2017-10-21 16:24:39

标签: c# .net api gmail

虽然这看起来很容易修复,但我的.net应用程序由于某种原因根本没有将其视为有效的base64字符串。

我使用GMail API来获取消息,在我尝试检索正文的最后一部分,我遇到了以下错误消息:

  

抛出异常:' System.FormatException'在mscorlib.dll中   System.FormatException:输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符,   或填充字符中的非法字符   在System.Convert.FromBase64_ComputeResultLength(Char * inputPtr,Int32 inputLength)
  在System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)
  在System.Convert.FromBase64String(String s)
  在E:\Programs\Programming\wForms\wForm\wForm\Form1.cs:line 127

中的wForm.Form1.d__9.MoveNext()

这是编码的字符串(在其他应用程序中解码很好,例如utilities-info网站): https://pastebin.ca/3893521

我的代码用于加载Windows窗体并获取这些消息:

private async void Form1_Load(object sender, EventArgs e)
{
    txtEmail_ID.Focus();
    try
    {
        requestLabel = service.Users.Labels.List("me");
        requestMessage = service.Users.Messages.List("me");
        //requestMessage.LabelIds = "INBOX";
        //requestMessage.IncludeSpamTrash = false;
        // requestMessage.Q = "is:unread";

        var messageResponse = await requestMessage.ExecuteAsync();
        if (messageResponse != null && messageResponse.Messages != null)
        {
            foreach (var message in messageResponse.Messages)
            {
                var currentMessage = new messageInfo();
                var requestNestedMessage = service.Users.Messages.Get("me", message.Id);
                var nestedMessageResponse = await requestNestedMessage.ExecuteAsync();

                if (nestedMessageResponse != null) // Check if we have nested params
                {
                    foreach (var mParts in nestedMessageResponse.Payload.Headers) // Loop msg headers
                    {
                        if (mParts.Name == "Date")
                        {
                            currentMessage.msgDate = mParts.Value; // Get msg date
                        }
                        else if (mParts.Name == "From")
                        {
                            currentMessage.msgSender = mParts.Value; // Get msg sender
                        }
                        else if (mParts.Name == "Subject")
                        {
                            currentMessage.msgTitle = mParts.Value; // Get msg subject
                        }
                    }
                    if (nestedMessageResponse.Payload.Parts == null && nestedMessageResponse.Payload.Body != null)
                    {
                        currentMessage.msgBody = nestedMessageResponse.Payload.Body.Data;
                    }
                    else
                    {
                        currentMessage.msgBody = returnNestedParts(nestedMessageResponse.Payload.Parts, "");
                    }

                    Console.WriteLine(currentMessage.msgSender);
                    String codedString = currentMessage.msgBody.Replace("-", "+");
                    codedString = codedString.Replace("_", "/");

                    byte[] data = Convert.FromBase64String(codedString);
                    currentMessage.msgBody = Encoding.UTF8.GetString(data);
                    mInfo.Add(currentMessage);
                }
            }
        }
    } catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    //comboFolders.SelectedIndex = 0;
}

该程序会在它获取的每条消息以及" Line 127"上抛出异常。是" byte []数据"

我尝试在这个论坛中搜索类似的问题,然而,他们的解决方案似乎都没有起作用,因为大多数解决方案只是将 - 和_符号更改为适合的base64url类型。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,将其缩小到有效载荷部分。当我想要将消息的两个有效负载部分连接在一起时,会出现错误,导致尾随的“=”符号未被处理,因此会对我自己造成异常。