0

我正在提供一项服务,该服务可以在 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;
        }
    }
}

我希望有专业人士可以帮助我解决这个问题......提前致谢!

4

0 回答 0