我正在提供一项服务,该服务可以在 Oracle DB 表中提取最新日期。在Debug中,程序正常工作,但是当我将程序发布到服务器时,运行时报错:
异常:System.AggregateException:(OracleConnection.Connection 字符串无效)---> System.InvalidOperationException:OracleConnection.Connection 字符串在 System.Data.Common.DbConnection.OpenAsync 的 Oracle.ManagedDataAccess.Client.OracleConnection.Open() 处无效(CancellationToken cancelToken) --- 从先前位置结束堆栈跟踪 --- 在 C:\Users*WORKER PATH* 中的 Project.Worker.GetMaxDateAsync()
应用设置:
{
"ConnectionStrings": {
"OracleDb": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=*ip*)(PORT=*port*)))(CONNECT_DATA=(SERIVCE_NAME=*name*)));User Id=*user*;Passowrd=*password*;PERSIST SECURITY INFO=True;Pooling=false"
},
"Serilog": {
"MinimulLevel": "Information",
"WriteTo": {
"Name": "Async",
"Args": {
"configure": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "Logs/log-.json",
"rollingInterval": "Day",
"retainedFileCountLimit": 14,
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
}
}
]
}
}
}
}
程序.cs:
namespace WorkerService1
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(loggingBuilder =>
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
loggingBuilder.AddSerilog(logger, dispose: true);
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
工人.cs:
namespace WorkerService1
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly string _oracleConnectionString;
public Worker(ILogger<Worker> logger)
{
_oracleConnectionString = configuration.GetConnectionString("OracleDb");
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running");
try
{
var dt = await GetMaxDateAsync();
}
catch(Exception e)
{
_logger.LogCritical(e, "Critical treatment");
}
_logger.LogInformation("Worker stoped");
await Task.Delay(1000, stoppingToken);
}
}
public async Task<DateTime?> GetMaxDateAsync()
{
const string resultKey = "result";
DateTime? dt = null;
using var oracleConnection = new OracleConnection(_oracleConnectionString);
using var oracleGetCmd = new OracleCommand("path", oracleConnection)
{
CommandType = CommandType.StoredProcedure
};
try
{
await oracleConnection.OpenAsync();
_logger.LogInformation("Open Oracle connection");
oracleGetCmd.Parameters.Add(resultKey, OracleDbType.Date, ParameterDirection.ReturnValue);
await oracleGetCmd.ExecuteNonQueryAsync();
dt = DateTime.TryParse(oracleGetCmd.Parameters[resultKey].Value.ToString);
}
catch (Exception e)
{
throw new ArgumentException("Exception when function getting", e);
}
finally
{
if(oracleConnection.State != ConnectionState.Closed)
{
await oracleConnection.CloseAsync();
}
}
return dt;
}
}
}
我希望有专业人士可以帮助我解决这个问题......提前致谢!