Вызов метода с кварцевым планировщиком для создания ACH-файла с использованием ChoNacha дает исключение
Я хочу автоматически генерировать ACH-файлы с помощью планировщика. Вызов планировщика дает мне исключение, тогда как при прямом вызове с URL я не реализовал следующий код для создания файлов ACH.
//scheduler job
Task IJob.Execute(IJobExecutionContext context)
{
SchedularMethodsController obj = new SchedularMethodsController();
var T = Task.Run(() => obj.AchFileGenerator(DateTime.Now));\
T.Wait();
return T;
}
метод генерации и записи ACH-файла следующий:
public void AchFileGenerator(DateTime Dt)
{
ChoNACHAConfiguration config = new ChoNACHAConfiguration();
config.DestinationBankRoutingNumber = "999999999";
config.OriginatingCompanyId = "7999999999";
config.DestinationBankName = ("PNC Bank").ToUpper();
config.OriginatingCompanyName = ("automatecondominium").ToUpper();
config.ReferenceCode = ("mgmt").ToUpper();
config.BlockingFactor = 10;
var unitowners = Achbll.GetUnitOwnerPaymentList(Dt).ToList();
var FileName = "ACH_" + ((DateTime.Now.ToString()).Replace(" ", "_").Replace(":", "_")) + ".txt";
var backpath = "CondoDocuments\\DocumentLibrary\\" + FileName;
var path = HttpRuntime.AppDomainAppPath + backpath;
using (var fs = System.IO.File.Create(path))
{
fs.Close();
fs.Dispose();
}
try
{
using (var nachaWriter = new ChoNACHAWriter(path, config))
{
using (var bw2 = nachaWriter.CreateBatch(200, "PPD", "DIR DEBIT", DateTime.Now, DateTime.Now.AddDays(1), null, null, '1', null, null))
{
foreach (var owner in unitowners)
{
if (!string.IsNullOrEmpty(owner.AccountNo) && !string.IsNullOrEmpty(owner.BankRoutingCode))
{
var UA = Cipher.decrypt(owner.AccountNo);
var BR = Cipher.decrypt(owner.BankRoutingCode);
var Name = owner.UnitOwnerName.Split(' ');
if (Name.Length > 1)
{
using (var entry = bw2.CreateDebitEntryDetail(27, BR.ToString(), UA.ToString(), 779, " 18H00A " + owner.UnitNo.ToString(), (Name[1] + ", " + Name[0]).ToUpper().ToString()))
{
//entry.CheckDigit = '0';
}
}
else
{
using (var entry = bw2.CreateDebitEntryDetail(27, BR.ToString(), UA.ToString(), 779, " 18H00B " + owner.UnitNo.ToString(), (Name[0]).ToUpper().ToString()))
{
//entry.CheckDigit = '0';
}
}
}
}
}
}
}
catch (Exception ex)
{
}
}
Это мой вызов планировщика в global.asax:
protected void Application_Start()
{
Invoker ob = new Invoker();
ob.StartScheduling();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Job invoke class:-
public async void StartScheduling()
{
// construct a scheduler factory
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" }
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler();
await scheduler.Start();
IJobDetail job = JobBuilder.Create<ExecutableJobs>()
.WithIdentity("myJob", "group1") // name "myJob", group "group1"
.Build();
var start = DateTime.Now.AddMinutes(1);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
//.StartAt(start) // if a start time is not given (if this line were omitted), "now" is implied
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(1).
RepeatForever())
.ForJob(job)
.Build();
await scheduler.ScheduleJob(job, trigger);
}
Исключение, которое я получаю:
1) Информация об исключении **************************************************** Тип: System.TypeInitializationException TypeName: ChoETL.ChoAppSettings Сообщение: инициализатор типа для ChoETL.ChoAppSettings вызвал исключение. Данные: System.Collections.ListDictionaryInternal TargetSite: System.String GetValue(System.String, System.String, Boolean) HelpLink: NULL Источник: ChoETL HResult: -2146233036
Информация StackTrace **************************************************** на ChoETL.ChoAppSettings.GetValue(строковый ключ, String defaultValue, логическое saveDefaultValue) в ChoETL.ChoETLFramework.GetConfigValue(строковый ключ, String defaultValue) в ChoETL.ChoETLFramework.GetConfigValue[ключ по умолчанию.
2) Информация об исключении **************************************************** Тип: System.ArgumentException Сообщение: exePath должно быть указано, если оно не запущено внутри отдельного exe-файла. ParamName: NULL Data: System.Collections.ListDictionaryInternal TargetSite: System.Configuration.Configuration OpenExeConfigurationImpl(System.Configuration.ConfigurationFileMap, логическое значение, System.Configuration.ConfigurationUserLevel, System.String, логическое значение) 2147024809
Информация StackTrace **************************************************** в Системе.Configuration.ConfigurationManager.OpenExeConfigurationImpl(файл-карты ConfigurationFileMap, логический isMachine, ConfigurationUserLevel userLevel, String exePath, логический preLoad) в System.Configuration.ConfigurationManager.OpenExeConfiguration(String exePath..hoppC) (ChoPL). В ChoCet
1 ответ
Кажется, ошибка в библиотеке ChoETL. Будет исправлена и выпущена на следующей версии.
В то же время, пожалуйста, сделайте, как показано ниже, чтобы преодолеть эту проблему
public void AchFileGenerator(DateTime Dt)
{
//Set this flag to fix the issue
ChoETLFrxBootstrap.IsSandboxEnvironment = true;
ChoNACHAConfiguration config = new ChoNACHAConfiguration();
config.DestinationBankRoutingNumber = "999999999";
config.OriginatingCompanyId = "7999999999";
.....
}
ОБНОВИТЬ:
Пожалуйста, установите последний пакет Nuget ChoETL (v1.0.8.4).
Дай мне знать.