SFTPSession entfernt

stattdessen wird ein open command gesendet. Gleichzeitig wird die Ausgabe nicht mehr
zum Ende gelesen sondern per Events abgefragt. Die Hoffnung ist hier, dass der Prozess nicht
mehr auf dem ReadToEnd() blockiert, wobei das nie bestätigt werden konnte.
This commit is contained in:
Daniel Schick 2023-07-08 12:20:40 +02:00
parent 0b2893ecde
commit 04907e2104
9 changed files with 195 additions and 59 deletions

View File

@ -292,9 +292,7 @@ namespace SendNSWMessageService
// external processing for dbh
bsmd.dbh.MessageController.SendAndReceive();
List<MessageCore> coresMarkedForStatusQuery = DBManager.Instance.GetMessageCoresWithNSWStatusFlag();
foreach (MessageCore core in coresMarkedForStatusQuery)
foreach (MessageCore core in DBManager.Instance.GetMessageCoresWithNSWStatusFlag())
{
core.QueryNSWStatus = false; // reset flag
Status aStatus = new Status(core);

View File

@ -97,7 +97,7 @@ namespace bsmd.dakosy
}
public static void TransmitAll(string remoteDir, string localDir, Direction direction, string sessionName)
private static Process StartWinSCPProcess()
{
Process winscp = new Process();
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
@ -107,12 +107,24 @@ namespace bsmd.dakosy
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.RedirectStandardError = true;
winscp.StartInfo.CreateNoWindow = true;
winscp.EnableRaisingEvents = true;
winscp.OutputDataReceived += (s, e) => _log.Debug(e.Data);
winscp.ErrorDataReceived += (s, e) => _log.Warn(e.Data);
winscp.Start();
winscp.BeginErrorReadLine();
winscp.BeginOutputReadLine();
return winscp;
}
public static void TransmitAll(string remoteDir, string localDir, Direction direction, string openCommand)
{
Process winscp = StartWinSCPProcess();
// Feed in the scripting commands
winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open " + sessionName);
winscp.StandardInput.WriteLine(openCommand);
winscp.StandardInput.WriteLine("lcd " + localDir);
// winscp.StandardInput.WriteLine("ls");
if (remoteDir != null)
@ -121,62 +133,29 @@ namespace bsmd.dakosy
winscp.StandardInput.WriteLine("get *.xml");
if(direction == Direction.OUTGOING)
winscp.StandardInput.WriteLine("put *.xml");
// move back up since winscp session remembers the last folder
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.Close();
// Collect all output
string output = winscp.StandardOutput.ReadToEnd();
_log.Debug(output);
output = winscp.StandardError.ReadToEnd();
if(!output.Trim().IsNullOrEmpty())
_log.Warn(output);
// Wait until WinSCP finishes
winscp.WaitForExit();
}
public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName)
public static void RemoveProcessedFile(string remoteDir, string filename, string openCommand)
{
Process winscp = new Process();
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
winscp.StartInfo.Arguments = "/xmllog=\"" + Properties.Settings.Default.SFTPLog + "\"";
winscp.StartInfo.UseShellExecute = false;
winscp.StartInfo.RedirectStandardInput = true;
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.RedirectStandardError = true;
winscp.StartInfo.CreateNoWindow = true;
winscp.Start();
Process winscp = StartWinSCPProcess();
// Feed in the scripting commands
winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open " + sessionName);
winscp.StandardInput.WriteLine(openCommand);
// winscp.StandardInput.WriteLine("ls");
if (remoteDir != null)
winscp.StandardInput.WriteLine("cd " + remoteDir);
winscp.StandardInput.WriteLine("rm " + filename);
if (remoteDir != null)
{
// move back up since winscp session remembers the last folder
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.WriteLine("cd ..");
}
winscp.StandardInput.Close();
// Collect all output
string output = winscp.StandardOutput.ReadToEnd();
_log.Debug(output);
output = winscp.StandardError.ReadToEnd();
if (!output.Trim().IsNullOrEmpty())
_log.Warn(output);
// Wait until WinSCP finishes
winscp.WaitForExit();
}
}
}
}

View File

@ -6,7 +6,7 @@ using System;
using System.IO;
using bsmd.database;
using System.Linq;
namespace bsmd.dbh
{
@ -117,7 +117,7 @@ namespace bsmd.dbh
public static void SendAndReceive()
{
// sent unsent messages in output folder
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPSessionName);
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPOpenCommand);
// move files from output folder to archive folder
foreach(string sentFile in Directory.GetFiles(Properties.Settings.Default.OutgoingFolder))
{
@ -130,7 +130,7 @@ namespace bsmd.dbh
// receive files from remote host
// SFTP verbindung öffnen und alle Dateien herunterladen
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPSessionName);
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPOpenCommand);
foreach (string inputFile in Directory.GetFiles(Properties.Settings.Default.IncomingFolder))
{
@ -151,7 +151,7 @@ namespace bsmd.dbh
File.Delete(inputFile);
}
// remote Dateien löschen
bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName);
bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPOpenCommand);
}
}

View File

@ -89,15 +89,17 @@ namespace bsmd.dbh.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("dbh")]
public string SFTPSessionName {
public string SFTPOpenCommand {
get {
return ((string)(this["SFTPSessionName"]));
return ((string)(this["SFTPOpenCommand"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
[global::System.Configuration.DefaultSettingValueAttribute("sftp://f-000333@fx.dbh.de/ -hostkey=\"ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5" +
"fXsUyZsVCSufyATbGKLh+ak\" -privatekey=\"C:\\work\\Services\\SendNSWMessageService\\dbh" +
"\\sshkeynp.ppk\"")]
public string IncomingErrorFolder {
get {
return ((string)(this["IncomingErrorFolder"]));

View File

@ -23,11 +23,11 @@
<Setting Name="RemoteOutgoingFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)">test/dbh_2_bsmd</Value>
</Setting>
<Setting Name="SFTPSessionName" Type="System.String" Scope="Application">
<Setting Name="SFTPOpenCommand" Type="System.String" Scope="Application">
<Value Profile="(Default)">dbh</Value>
</Setting>
<Setting Name="IncomingErrorFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
<Value Profile="(Default)">sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk"</Value>
</Setting>
<Setting Name="SenderMaersk" Type="System.String" Scope="Application">
<Value Profile="(Default)">00006017</Value>

View File

@ -778,7 +778,7 @@ namespace bsmd.dbh
rootPre.TankerDetails.ConditionCargoBallastTanks = (TankCondition)pre72h.ConditionCargoBallastTanks.Value;
if (pre72h.NatureOfCargo != string.Empty)
rootPre.TankerDetails.TypeOfCargo = pre72h.NatureOfCargo;
bool sendVolume = pre72h.VolumeOfCargo.HasValue && (pre72h.VolumeOfCargo.Value > 0);
bool sendVolume = pre72h.VolumeOfCargo > 0;
rootPre.TankerDetails.VolumeOfCargo_TNESpecified = sendVolume;
if (sendVolume)
rootPre.TankerDetails.VolumeOfCargo_TNE = Decimal.Round((decimal)(pre72h.VolumeOfCargo.Value), 3);

View File

@ -129,7 +129,7 @@ namespace bsmd.dbh
case Response.RootType.RESET:
if(root.ReportingClassesResetted?.ReportingClass.Length > 0)
{
_log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); ;
_log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length);
sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück
sentMessage.Status = Message.MessageStatus.ACCEPTED;
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;

View File

@ -28,11 +28,11 @@
<setting name="RemoteOutgoingFolder" serializeAs="String">
<value>test/dbh_2_bsmd</value>
</setting>
<setting name="SFTPSessionName" serializeAs="String">
<setting name="SFTPOpenCommand" serializeAs="String">
<value>dbh</value>
</setting>
<setting name="IncomingErrorFolder" serializeAs="String">
<value />
<value>sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk"</value>
</setting>
<setting name="SenderMaersk" serializeAs="String">
<value>00006017</value>

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="SendNSWMessageService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.dakosy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.dbh.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.hisnord.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.status.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="C:\\work\\Logs\\log-NSWMessageServiceTest.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level [%logger] - %message%newline" />
</layout>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<applicationSettings>
<bsmd.status.Properties.Settings>
<setting name="login" serializeAs="String">
<value>BSMD-PROD</value>
</setting>
<setting name="password" serializeAs="String">
<value>t7g7fDP18#7GQw#D</value>
</setting>
<setting name="url" serializeAs="String">
<value>https://www.his-nord.de/HIS-Service/StatusInfoNSW.jsp</value>
</setting>
</bsmd.status.Properties.Settings>
<SendNSWMessageService.Properties.Settings>
<setting name="ConnectionString" serializeAs="String">
<value>Initial Catalog=nswtest;Data Source=192.168.2.24\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false</value>
</setting>
<setting name="SleepSeconds" serializeAs="String">
<value>30</value>
</setting>
</SendNSWMessageService.Properties.Settings>
<bsmd.dakosy.Properties.Settings>
<setting name="SFTPSessionName" serializeAs="String">
<value>dakosy</value>
</setting>
<setting name="SFTPLog" serializeAs="String">
<value>c:\temp\sftp_log.xml</value>
</setting>
<setting name="SFTPOutDir" serializeAs="String">
<value>c:\work\dakosy\out</value>
</setting>
<setting name="SFTPInDir" serializeAs="String">
<value>c:\work\dakosy\in</value>
</setting>
<setting name="TestMode" serializeAs="String">
<value>True</value>
</setting>
<setting name="WINSCPFullPath" serializeAs="String">
<value>c:\work\Tools\WinSCP\WinSCP.com</value>
</setting>
<setting name="RemoteProdIncomingDir" serializeAs="String">
<value>in/prod/ed02</value>
</setting>
<setting name="RemoteTestIncomingDir" serializeAs="String">
<value>in/test/ed02</value>
</setting>
<setting name="RemoteProdOutgoingDir" serializeAs="String">
<value>out/prod</value>
</setting>
<setting name="RemoteTestOutgoingDir" serializeAs="String">
<value>out/test</value>
</setting>
</bsmd.dakosy.Properties.Settings>
<bsmd.dbh.Properties.Settings>
<setting name="bsmd_dbh_DBHWebReference_Dbh_Osis_Answ_Ws" serializeAs="String">
<value>https://edi-gate.dbh.de/bsmd-soap</value>
</setting>
<setting name="Sender" serializeAs="String">
<value>00003050</value>
<!-- Maersk produktiv value>00000768</value-->
<!-- BSMD-PROD value>00003050</value-->
</setting>
<setting name="SenderMaersk" serializeAs="String">
<value>00006017</value>
</setting>
<setting name="OutgoingFolder" serializeAs="String">
<value>C:\temp\dbh\out</value>
</setting>
<setting name="OutgoingArchiveFolder" serializeAs="String">
<value>C:\temp\dbh\out_archive</value>
</setting>
<setting name="IncomingFolder" serializeAs="String">
<value>C:\temp\dbh\in</value>
</setting>
<setting name="IncomingArchiveFolder" serializeAs="String">
<value>C:\temp\dbh\in_archive</value>
</setting>
<setting name="IncomingErrorFolder" serializeAs="String">
<value>C:\temp\dbh\in_error</value>
</setting>
<setting name="RemoteIncomingFolder" serializeAs="String">
<value>test/bsmd_2_dbh</value>
</setting>
<setting name="RemoteOutgoingFolder" serializeAs="String">
<value>test/dbh_2_bsmd</value>
</setting>
<setting name="SFTPOpenCommand" serializeAs="String">
<value>open sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\git_lager\git_bsmd\bsmd.dbh\misc\sshkeynp.ppk"</value>
</setting>
</bsmd.dbh.Properties.Settings>
<bsmd.hisnord.Properties.Settings>
<setting name="TransmitterRoot" serializeAs="String">
<value>C:\work\HIS-NORD\Test</value>
</setting>
<setting name="OutputDir" serializeAs="String">
<value>IMP</value>
</setting>
<setting name="Transmitter" serializeAs="String">
<value>client.bat</value>
</setting>
<setting name="BatchTimeoutMins" serializeAs="String">
<value>1</value>
</setting>
<setting name="ResultDir" serializeAs="String">
<value>RESULTS</value>
</setting>
<setting name="AnswerDir" serializeAs="String">
<value>ANSWERS</value>
</setting>
<setting name="AnswerArchiveDir" serializeAs="String">
<value>ANSWERS_DONE</value>
</setting>
<setting name="AnswerCorruptDir" serializeAs="String">
<value>ANSWERS_CORRUPT</value>
</setting>
</bsmd.hisnord.Properties.Settings>
</applicationSettings>
<system.web>
<webServices>
<!-- zum debuggen -->
<soapExtensionTypes>
<add type="bsmd.database.SoapLoggerExtension, bsmd.database" priority="1" group="0" />
</soapExtensionTypes>
</webServices>
</system.web>
</configuration>