在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException

Posted

技术标签:

【中文标题】在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException【英文标题】:System.Net.Http.HttpRequestException while invoking Gmail service API in C# 【发布时间】:2021-08-21 21:06:11 【问题描述】:

在 C# 中使用 Gmail API 时会随机发生以下异常。我的代码可以正常工作几个小时,没有任何问题。以下异常以随机方式发生。要解决此问题,我只需要重新启动我的应用程序或重新启动 PC。重新启动后,一切正常。我想知道如何永久修复此异常。

03-Jun-2021 17:18:13,755 [INFO ] MailApi+<GmailSendUsingREST>d__27 MoveNext             - Email notification send error System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
   at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
   at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   at Google.Apis.Http.ConfigurableMessageHandler.<SendAsync>d__69.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Apis.Requests.ClientServiceRequest`1.<ExecuteUnparsedAsync>d__34.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()

代码:

 var service = new GmailService(new BaseClientService.Initializer()
 
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
 );

 var result = service.Users.Messages.Send(msg, "me").Execute();

Messages.Send 发生异常。

更新:

请参阅 *** 上的 this thread 了解可能的情况。

【问题讨论】:

一般来说,网络调用应该构建为重试,因为间歇性问题很常见。 Polly 是一个很好的框架,可以帮助您使网络调用更加健壮。我不明白为什么它需要整个过程,以至于你必须重新启动。也许你没有处理真正需要处理的东西。 【参考方案1】:

嗯,有几件事你需要注意。

    我认为 Gmail 对您每天可以发送的电子邮件有限制。限制数量取决于您拥有的帐户类型。

    确保 SSL 或 TLS 已打开以实现安全连接。

    底层连接已关闭:可能是您可以访问互联网但您没有访问网络服务的数据包。

    System.Security.Authentication.AuthenticationException:确保您的身份验证凭据正确。最后,

    如果您使用 gmail SMTP 发送电子邮件,请确保在您使用的帐户中打开不太安全的应用访问权限。

我希望这会有所帮助。快乐编码!

【讨论】:

感谢您的快速回复。请在下面找到我的 cmets。 1) 如果有限制,在我重新启动应用程序/PC 后它不应该工作。 2) 应用程序始终在同一台 PC 上运行。由于连接大部分时间都按预期工作,因此此错误仅随机发生。如果我的安全/证书不正确,我相信它甚至不会工作一次。 3) 我如何确认我是否没有用于访问 Web 服务的数据包。在本例中,我使用的是 Gmail REST API。 我真的不知道您是如何连接到互联网的,可能是通过 WiFi、以太网或蜂窝网络。无论哪种方式,请确保它允许您访问 ping 网络。可能是每次失败时,您已经无法访问互联网。您还可以查看我的 5 号选项,以确保您做的事情正确。

以上是关于在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException的主要内容,如果未能解决你的问题,请参考以下文章

访问 Gmail API 时出现错误请求

尝试使用服务帐户读取 GMAIL 时出现错误代码 400

客户端未经授权使用此方法检索访问令牌 Gmail API C#

发布到 Gmail API 时出现 http 500 后端错误

使用Gmail API时出现BrokenPipeError

请求 gmail-api 时出现 HttpError 429:超出用户速率限制