Tom*_*gan 2 c# serilog mailkit .net-core .net-6.0
这是一个使用 Serilog.Sinks.Email 2.4.0 的 .Net Core 6 控制台应用程序。在同一个项目中,我引用了 MailKit 3.1.0 Nuget 包。我注意到 Serilog.Sinks.Email 还引用了 Mailkit 3.1.0。
我正在像这样配置记录器。我的目标是让 Serilog 在调用 Log.Fatal() 时发送电子邮件:
.WriteTo.Email(
new EmailConnectionInfo()
{
FromEmail = _appSettings.EmailFrom,
ToEmail = _appSettings.EmailToOnError,
MailServer = _appSettings.EmailHost,
EmailSubject = $"Runtime error starting {_appSettings.ApplicationName}",
ServerCertificateValidationCallback = (s, c, h, e) => true
},
restrictedToMinimumLevel: LogEventLevel.Fatal);
Run Code Online (Sandbox Code Playgroud)
我将 Serilog 消息记录到调试输出窗口,如下所示,这样我就可以看到 Serilog 本来(按设计)吞咽的错误消息:
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)
当我调用 Log.Fatal(),然后立即调用 Log.CloseAndFlush(),并查看“调试输出”窗口时,我可以看到 Serilog 尝试向我发送电子邮件,但失败了,说它找不到 MailKit 方法.MailTransport.SendAsync()。知道我缺少什么吗?以下是调试输出窗口中的完整错误消息:
Exception while emitting periodic batch from
Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink: System.MissingMethodException:
Method not found: 'System.Threading.Tasks.Task
MailKit.MailTransport.SendAsync(MimeKit.MimeMessage, System.Threading.CancellationToken,
MailKit.ITransferProgress)'.
at Serilog.Sinks.Email.EmailSink.EmitBatchAsync(IEnumerable`1 events)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine]
(TStateMachine& stateMachine)
at Serilog.Sinks.Email.EmailSink.EmitBatchAsync(IEnumerable`1 events)
at Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.OnTick()
Run Code Online (Sandbox Code Playgroud)
MailKit 的 SmtpClient.SendAsync() 方法在 2.x 和 3.0 之间更改了其 API 签名。曾经回归Task
,现在回归Task<string>
。
这会导致针对 2.x 构建的库无法在 3.0(或 3.1)程序集中找到该方法。
将您的 MailKit 降级到 2.15(或 2.15.1),它可能会起作用。
归档时间: |
|
查看次数: |
1898 次 |
最近记录: |