1

我在 .Net 5 中创建了一个 Windows 后台服务,它连接到一个 SQL 服务器数据库,并检查要发送的电子邮件。当我从 Visual Studio 运行它时,它会启动并正常工作。但是,当我按照本教程部署包时 ,服务启动然后终止,并在事件日志中显示以下错误。

Application: MyMailer.exe
CoreCLR Version: 5.0.1121.47308
.NET Version: 5.0.11
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException: One or more errors occurred. (The ConnectionString property has not been initialized.)
 ---> System.InvalidOperationException: The ConnectionString property has not been initialized.
   at Microsoft.Data.SqlClient.SqlConnection.PermissionDemand()
   at Microsoft.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
   at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
   at Microsoft.Data.SqlClient.SqlConnection.InternalOpenAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location ---
   at Dapper.SqlMapper.QueryAsync[T](IDbConnection cnn, Type effectiveType, CommandDefinition command)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at MyMailer.MailService.GetMessagesToSendAsync()
   at MyMailer.MailService.CheckEmailToSend()
   at MyMailer.WindowsBackgroundService.ExecuteAsync(CancellationToken stoppingToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at <Program>$.<<Main>$>d__0.MoveNext()
--- End of stack trace from previous location ---
   at <Program>$.<Main>(String[] args)


  [1]: https://docs.microsoft.com/en-us/dotnet/core/extensions/windows-service

我知道它告诉我 ConnectionString 属性没有被初始化。我不明白为什么它在调试模式下运行良好时会抛出下面的错误。只有在部署时才会崩溃。

然而,我在同一解决方案中的剃须刀页面 Web 应用程序使用相同的方法、相同的连接字符串,并且此错误的问题为零。它只会与 Windows 后台服务应用程序一起崩溃。

这看起来像是后台服务的权限问题吗?我在这里想念什么?

我已经尝试在本地机器和服务器上以各种配置部署它......不走运。同样的错误。

任何帮助,将不胜感激。我已经搜索谷歌几个小时,似乎无法显示任何有用的东西。

谢谢你的帮助...

*** 更新 *** 有问题的代码似乎在这里:

        using var connection = new SqlConnection(ConString());

这称为...

   public static string ConString()
    {
        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        var config = builder.Build();
        string constring = config.GetConnectionString("DefaultConnection");
        return constring;
    }

这当然是从 appsettings.json 获取连接字符串,看起来像这样......

  "ConnectionStrings": {
"DefaultConnection": "Server=xxx.xxx.xxx.xxx;Database=xxxxxxxx;User Id=xxx;Password=xxxxxxx"

}

但是,我通过直接对连接字符串进行硬编码以绕过 ConString() 方法对其进行了测试,但仍然出现相同的错误。Windows 服务处理连接字符串的方式是否与 Web 应用程序不同?需要不同的格式吗?

4

0 回答 0