Я получаю странную ошибку: свойство строки подключения не инициализировано. Я прочитал все похожие вопросы.
В некотором контексте это .NET 8 Core Worker Service. Когда я запускаю в режиме отладки или выпуска, служба работает правильно, подключается к базам данных и может читать и записывать данные.
Проблема возникает, когда я публикую и пытаюсь запустить это как сервис [Windows Server].
Затем в моих журналах выдается ошибка:
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.Open(SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open()
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.c.b__21_0(DbContext _, Enumerator enumerator)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at PS360_RADI_SVC.Models.RadServiceLog.GetLastTimeServiceRan() in J:\Repos\PS360_RADI_svc\PS360EPICSVC\Models\RadServiceLog.cs:line 38
at PS360EPICSVC.Worker.ExecuteAsync(CancellationToken stoppingToken) in J:\Repos\PS360_RADI_svc\PS360EPICSVC\Worker.cs:line 58
Я старался убедиться, что в файле appsettings.json нет опечаток, а строки подключения правильно написаны и отформатированы.
Признаюсь, я немного запутался относительно того, где лучше всего объявлять эти строки подключения, то есть, должно ли это быть из файла Program.cs или из контекстных файлов для моделей базы данных, или и то, и другое. Сейчас это есть в обоих местах.
Ошибка возникает при первом вызове БД, который просто проверяет таблицу на предмет последнего запуска службы. Это в контексте LOGGING.
Есть мысли о том, что попробовать или в чем может быть проблема? Я не знаю, какое свойство строки подключения просмотреть или как его просмотреть. Что будет принципиально отличаться от его запуска в отладке Visual Studio и публикации как услуги?
Спасибо за любую помощь, которую вы можете предложить!
Это мой код - Program.cs:
using Microsoft.Extensions.Hosting.WindowsServices;
using Microsoft.Extensions.Configuration;
using PS360EPICSVC;
using Serilog;
using PS360_RADI_SVC.Classes;
using Microsoft.AspNetCore.Identity.UI.Services;
using PS360_RADI_SVC.Models;
using Microsoft.EntityFrameworkCore;
Environment.SetEnvironmentVariable("APP_BASE_DIRECTORY",
WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : Directory.GetCurrentDirectory());
var host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.UseSerilog((context, services, configuration) => configuration
.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services))
.ConfigureServices((hostContext,services) =>
{
//services.AddOptions().BindConfiguration("ConnectionStrings");
services.AddHostedService();
services.AddDbContext(options =>
options.UseSqlServer(hostContext.Configuration.GetConnectionString("DRADPRESCON")));
services.AddDbContext(options =>
options.UseSqlServer(hostContext.Configuration.GetConnectionString("DRADPRESCON")));
services.AddDbContext
(options =>
options.UseSqlServer(hostContext.Configuration.GetConnectionString("PS360CON")));
services.AddHttpClient();
services.AddTransient();
})
.Build();
await host.RunAsync();
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"DRADPRESCON":"Server=VSRADDLSQLRSHAO,57650;Database=DRADPRES;User=yRADPRES;Password=*******;TrustServerCertificate=True",
"PS360CON":"Server=VSRADPPSSQLAO,50151;Database=Comm4;Trusted_Connection=True;TrustServerCertificate=True"
},
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "%APP_BASE_DIRECTORY%/Logs/log-.txt",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName" ],
"Properties": {
"ApplicationName": "Your PS360EPIC App"
}
}
}
Worker.cs:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using PS360_RADI_SVC.Classes;
using PS360_RADI_SVC.Models;
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.ServiceProcess;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Builder;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
using Microsoft.AspNetCore.Identity.UI.Services;
using System.Runtime.ConstrainedExecution;
namespace PS360EPICSVC
{
public class Worker : BackgroundService
{
private readonly ILogger logger;
private readonly IEmailSender emailSender;
public Worker(ILogger logger, IEmailSender emailSender)
{
this.logger = logger;
this.emailSender = emailSender;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
logger.LogInformation("Worker staring at: {time}", DateTimeOffset.Now);
//var radservicelog = new RadServiceLog();
string service = "PS360EPICSVC";
string message = "Start PS360EPICSVC...";
DateTime? datetimeOfLastRun = DateTime.MinValue;
DateTime tempStart;
//Check for last time the service ran
try
{
datetimeOfLastRun = GetLastTimeServiceRan();
}
catch (Exception ex)
{
message = message + ex.Message;
logger.LogError(ex, "Error retrieving last time service ran.");
}
//Log the startup of the service
try
{
await PostServiceStatus(service, message, false);
}
catch (Exception ex)
{
message = message + ex.Message;
await PostServiceStatus(service, message, true);
logger.LogError(ex, "Error upon startup...");
}
while (!stoppingToken.IsCancellationRequested)
{
try
{
if (logger.IsEnabled(LogLevel.Information))
{
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
tempStart = DateTime.Now;
System.TimeSpan elapsed = tempStart.Subtract((DateTime)datetimeOfLastRun);
logger.LogInformation("GetPS360Data last run at: {time}, time elapsed: {elapsed}", datetimeOfLastRun, elapsed);
await GetPS360Data(stoppingToken, (DateTime)datetimeOfLastRun); //Main entrance
datetimeOfLastRun = tempStart;
}
catch (Exception ex)
{
logger.LogError(ex, "An error occurred while running GetPS360Data");
}
try
{
await GetMissingExamCodes();
}
catch (Exception ex)
{
logger.LogError(ex, "An error occurred while running GetMissingExamCodes");
}
finally
{
if (logger.IsEnabled(LogLevel.Information))
{
logger.LogInformation("Worker completed at: {time}", DateTimeOffset.Now);
}
await Task.Delay(60000, stoppingToken);
}
}
}
}
}
LOGGING.cs (контекстный файл):
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace PS360_RADI_SVC.Models;
public partial class LOGGING : DbContext
{
public LOGGING()
{
}
public LOGGING(DbContextOptions options)
: base(options)
{
}
public virtual DbSet RadServiceLogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer("Server=VSRADDLSQLRSHAO,57650;Database=DRADPRES;User=yRADPRES;Password=******;TrustServerCertificate=True");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity
.ToTable("rad_Service_Logs");
entity.HasIndex(e => e.ActionDate, "ActionDate").IsDescending();
entity.Property(e => e.ActionDate).HasColumnType("datetime");
entity.Property(e => e.Id)
.ValueGeneratedOnAdd()
.HasColumnName("id");
entity.Property(e => e.Message)
.HasMaxLength(1000)
.IsUnicode(false)
.IsFixedLength();
entity.Property(e => e.Service)
.HasMaxLength(50)
.IsUnicode(false)
.IsFixedLength();
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
PS360.cs (контекст):
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.EntityFrameworkCore;
namespace PS360_RADI_SVC.Models;
public partial class PS360 : DbContext
{
public PS360()
{
}
public PS360(DbContextOptions options)
: base(options)
{
}
public virtual DbSet ExplorerDistincts { get; set; }
public virtual DbSet Orders { get; set; }
public virtual DbSet Patients { get; set; }
public virtual DbSet Reports { get; set; }
public virtual DbSet Accounts { get; set; }
public virtual DbSet OrderCustomFields { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer("Server = VSRADPPSSQLAO, 50151; Database=Comm4;Trusted_Connection=True;TrustServerCertificate=True");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
modelBuilder.Entity(entity =>
modelBuilder.Entity(entity =>
modelBuilder.Entity(entity =>
modelBuilder.Entity(entity =>
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... een-initia
Невозможно запустить ошибку хостинга: свойство ConnectionString не было инициализировано для основной рабочей службы .NE ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как устранить ошибку «Свойство ConnectionString не инициализировано» [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 56 Просмотры
-
Последнее сообщение Anonymous
-