diff --git a/EDMI_ClientSuite/ClassConfig.vb b/EDMI_ClientSuite/ClassConfig.vb index d4a2c7f5..bbf69a37 100644 --- a/EDMI_ClientSuite/ClassConfig.vb +++ b/EDMI_ClientSuite/ClassConfig.vb @@ -36,8 +36,14 @@ Public Class ClassConfig End Property ' === Simple/Actual Config Properties === + ' === Service Configuration === Public Property ServiceIP As String = String.Empty Public Property ServicePort As Integer = -1 + Public Property HeartbeatInterval As Integer = 5000 + + ' === Logging Configuration Public Property LogDebug As Boolean = False + + ' === User Configuration === Public Property UserLanguage As String = "de-DE" End Class diff --git a/EDMI_ClientSuite/ClassLayout.vb b/EDMI_ClientSuite/ClassLayout.vb index 0b9e8e26..1935d98d 100644 --- a/EDMI_ClientSuite/ClassLayout.vb +++ b/EDMI_ClientSuite/ClassLayout.vb @@ -1,7 +1,21 @@ Imports System.IO +''' +''' Helper Class to save DevExpress layouts +''' +''' Example: +''' +''' Layout 1 (for frmMain) +''' ---------------------------------------------- +''' | Component 1 Component 2 | +''' | |-------------| |----------------| | +''' | | MainGrid | | DocumentGrid | | +''' | |-------------| |----------------| | +''' | | +''' |--------------------------------------------- +''' Public Class ClassLayout - Public Enum LayoutName + Public Enum GroupName LayoutMain End Enum @@ -10,9 +24,19 @@ Public Class ClassLayout DocumentManager End Enum - Public Shared Function GetLayoutPath(LayoutName As LayoutName, Component As LayoutComponent) As String - Dim oFileName As String = $"{LayoutName.ToString}-{Component.ToString}.xml" - Return IO.Path.Combine(GetAppDataFolder(), ClassConstants.FOLDER_NAME_LAYOUT, oFileName) + ''' + ''' Returns a path for the chosen Devexpress layout file + ''' + ''' The Group to which the the component belongs to. For example, a form could be a Layout + ''' The component to which the layout belongs to + ''' + Public Shared Function GetLayoutPath(Group As GroupName, Component As LayoutComponent) As String + Dim oFileName As String = $"{Group.ToString}-{Component.ToString}.xml" + Return Path.Combine(GetLayoutDirectory(), oFileName) + End Function + + Public Shared Function GetLayoutDirectory() As String + Return Path.Combine(GetAppDataFolder(), ClassConstants.FOLDER_NAME_LAYOUT) End Function Private Shared Function GetAppDataFolder() As String diff --git a/EDMI_ClientSuite/ClassService.vb b/EDMI_ClientSuite/ClassService.vb index 479ac410..50f0c09e 100644 --- a/EDMI_ClientSuite/ClassService.vb +++ b/EDMI_ClientSuite/ClassService.vb @@ -18,6 +18,32 @@ Public Class ClassService _Logger = _LogConfig.GetLogger() End Sub + Public Function TestConnection() As ConnectionTestResult + Return TestConnection(My.Config.ServiceConnection) + End Function + + Public Function TestConnection(EndpointURL As String) As ConnectionTestResult + Try + Dim oChannelFactory = GetChannelFactory(EndpointURL) + Dim oChannel = oChannelFactory.CreateChannel() + oChannel.OperationTimeout = New TimeSpan(0, 0, ClassConstants.SERVICE_OPEN_TIMEOUT) + oChannel.Open() + oChannel.Close() + + Return ConnectionTestResult.Successful + Catch ex As EndpointNotFoundException + _Logger.Error(ex) + Return ConnectionTestResult.NotFound + Catch ex As Exception + _Logger.Error(ex) + Return ConnectionTestResult.Unknown + End Try + End Function + + Public Async Function TestConnectionAsync() As Task(Of ConnectionTestResult) + Return Await TestConnectionAsync(My.Config.ServiceConnection) + End Function + Public Async Function TestConnectionAsync(EndpointURL As String) As Task(Of ConnectionTestResult) Return Await Task.Factory.StartNew(Function() Try diff --git a/EDMI_ClientSuite/ClassTimer.vb b/EDMI_ClientSuite/ClassTimer.vb index ec024c02..7862b158 100644 --- a/EDMI_ClientSuite/ClassTimer.vb +++ b/EDMI_ClientSuite/ClassTimer.vb @@ -1,4 +1,5 @@ -Imports System.Threading +Imports System.ServiceModel +Imports System.Threading Imports System.Timers Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference Imports DigitalData.Modules.Logging @@ -10,28 +11,56 @@ Public Class ClassTimer Private _Timer As Timers.Timer Private _Channel As IEDMServiceChannel - Private Const TIMER_START_TIME = 1000 - Private Const TIMER_INTERVAL = 5000 + Public Event OnlineChanged As OnlineChangedEventHandler + Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) - Public Sub Callback(sender As Object, e As ElapsedEventArgs) - _Logger.Info("Checking if Service is up...") + Public Sub New(LogConfig As LogConfig, SynchronizingObject As frmMain, HeartbeatInterval As Integer) + Try + _LogConfig = LogConfig + _Logger = LogConfig.GetLogger() - ' Connect to service and send hearbeat request + _Channel = My.ChannelFactory.CreateChannel() + _Channel.Open() - My.Application.Service.Online = True - My.Application.Service.LastChecked = DateTime.Now + _Timer = New Timers.Timer(HeartbeatInterval) With { + .SynchronizingObject = SynchronizingObject, + .Enabled = True + } + + AddHandler _Timer.Elapsed, AddressOf Callback + Catch ex As Exception + _Logger.Error(ex) + End Try End Sub - Public Sub New(LogConfig As LogConfig) - _LogConfig = LogConfig - _Logger = LogConfig.GetLogger() + Public Async Sub Callback(sender As Object, e As ElapsedEventArgs) + Try + _Logger.Debug("Checking if Service is up...") - _Channel = My.ChannelFactory.CreateChannel() - _Channel.Open() + If _Channel.State = ServiceModel.CommunicationState.Faulted Then + _Channel = My.ChannelFactory.CreateChannel() + End If - _Timer = New Timers.Timer(TIMER_INTERVAL) - _Timer.SynchronizingObject = My.MainForm - AddHandler _Timer.Elapsed, AddressOf Callback - _Timer.Enabled = True + ' Connect to service and send hearbeat request + Dim oResult = Await _Channel.HeartbeatAsync() + + + _Logger.Debug("Service is online") + + SetOnlineState(True) + Catch ex As Exception + _Logger.Debug("Service is offline!") + + SetOnlineState(False) + Finally + My.Application.Service.LastChecked = DateTime.Now + End Try + End Sub + + Private Sub SetOnlineState(NewState As Boolean) + If My.Application.Service.Online <> NewState Then + My.Application.Service.Online = NewState + RaiseEvent OnlineChanged(Me, NewState) + End If End Sub End Class diff --git a/EDMI_ClientSuite/ClientSuite.vbproj b/EDMI_ClientSuite/ClientSuite.vbproj index 04da0669..b961e407 100644 --- a/EDMI_ClientSuite/ClientSuite.vbproj +++ b/EDMI_ClientSuite/ClientSuite.vbproj @@ -207,8 +207,8 @@ True - - + + True True diff --git a/EDMI_ClientSuite/MyApplication.vb b/EDMI_ClientSuite/MyApplication.vb index 1669412c..668e9a65 100644 --- a/EDMI_ClientSuite/MyApplication.vb +++ b/EDMI_ClientSuite/MyApplication.vb @@ -29,8 +29,8 @@ Namespace My ''' Partial Class MyApplication ' User Config - Public User As New UserState() - Public Service As New ServiceState() + Public User As New ClassUserState() + Public Service As New ClassServiceState() End Class End Namespace diff --git a/EDMI_ClientSuite/State/ClassServiceState.vb b/EDMI_ClientSuite/State/ClassServiceState.vb new file mode 100644 index 00000000..25047b48 --- /dev/null +++ b/EDMI_ClientSuite/State/ClassServiceState.vb @@ -0,0 +1,4 @@ +Public Class ClassServiceState + Public Property Online As Boolean = True + Public Property LastChecked As DateTime = DateTime.Now +End Class diff --git a/EDMI_ClientSuite/State/UserState.vb b/EDMI_ClientSuite/State/ClassUserState.vb similarity index 93% rename from EDMI_ClientSuite/State/UserState.vb rename to EDMI_ClientSuite/State/ClassUserState.vb index c9b8360c..41bc5b75 100644 --- a/EDMI_ClientSuite/State/UserState.vb +++ b/EDMI_ClientSuite/State/ClassUserState.vb @@ -3,7 +3,7 @@ ''' ''' Helper Class to hold User State ''' -Public Class UserState +Public Class ClassUserState Public UserName As String Public MachineName As String Public Language As String diff --git a/EDMI_ClientSuite/State/ServiceState.vb b/EDMI_ClientSuite/State/ServiceState.vb deleted file mode 100644 index 2cba01a4..00000000 --- a/EDMI_ClientSuite/State/ServiceState.vb +++ /dev/null @@ -1,9 +0,0 @@ -Public Class ServiceState - Public Online As Boolean - Public LastChecked As DateTime - - Public Sub New() - Online = True - LastChecked = DateTime.Now - End Sub -End Class diff --git a/EDMI_ClientSuite/frmConfigService.vb b/EDMI_ClientSuite/frmConfigService.vb index d0a60491..60a66feb 100644 --- a/EDMI_ClientSuite/frmConfigService.vb +++ b/EDMI_ClientSuite/frmConfigService.vb @@ -22,7 +22,7 @@ My.Config.ServicePort = Integer.Parse(oPort) lblStatus.Text = "Verbindung wird hergestellt..." - oResult = Await _Service.TestConnectionAsync(My.ConfigManager.Config.ServiceConnection) + oResult = Await _Service.TestConnectionAsync() If oResult = ClassService.ConnectionTestResult.Successful Then My.ConfigManager.Save() diff --git a/EDMI_ClientSuite/frmMain.Designer.vb b/EDMI_ClientSuite/frmMain.Designer.vb index bc74496a..489d0300 100644 --- a/EDMI_ClientSuite/frmMain.Designer.vb +++ b/EDMI_ClientSuite/frmMain.Designer.vb @@ -19,10 +19,11 @@ Partial Class frmMain 'Do not modify it using the code editor. Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain)) Dim PushTransition1 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() Me.RibbonControl = New DevExpress.XtraBars.Ribbon.RibbonControl() - Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu() + Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu(Me.components) Me.BarButtonExit = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonUserSettings = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonConnectionSettings = New DevExpress.XtraBars.BarButtonItem() @@ -39,6 +40,7 @@ Partial Class frmMain Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem() Me.BarWorkspaceMenuItem1 = New DevExpress.XtraBars.BarWorkspaceMenuItem() Me.WorkspaceManager1 = New DevExpress.Utils.WorkspaceManager() + Me.LabelServiceOnline = New DevExpress.XtraBars.BarStaticItem() Me.RibbonPageCategoryEntityDesigner = New DevExpress.XtraBars.Ribbon.RibbonPageCategory() Me.RibbonPageControlActions = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup5 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() @@ -50,16 +52,16 @@ Partial Class frmMain Me.RibbonPageWorkflow = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup4 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() - Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager() - Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView() - Me.DockManager = New DevExpress.XtraBars.Docking.DockManager() + Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager(Me.components) + Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView(Me.components) + Me.DockManager = New DevExpress.XtraBars.Docking.DockManager(Me.components) Me.panelContainer1 = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanelGlobix = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanel1_Container = New DevExpress.XtraBars.Docking.ControlContainer() Me.Label1 = New System.Windows.Forms.Label() Me.DockPanelProcessManager = New DevExpress.XtraBars.Docking.DockPanel() Me.DockPanel2_Container = New DevExpress.XtraBars.Docking.ControlContainer() - Me.ProcessManagerWidget = New ClientSuite.ProcessManagerWidget() + Me.ProcessManagerWidget = New DigitalData.GUIs.ClientSuite.ProcessManagerWidget() CType(Me.RibbonControl, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.MainMenu, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DocumentManager, System.ComponentModel.ISupportInitialize).BeginInit() @@ -76,9 +78,9 @@ Partial Class frmMain ' Me.RibbonControl.ApplicationButtonDropDownControl = Me.MainMenu Me.RibbonControl.ExpandCollapseItem.Id = 0 - Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.BarButtonDock1, Me.SkinDropDownButtonItem1, Me.BarButtonDashboard, Me.BarButtonEntityDesigner, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1}) + Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.BarButtonDock1, Me.SkinDropDownButtonItem1, Me.BarButtonDashboard, Me.BarButtonEntityDesigner, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1, Me.LabelServiceOnline}) Me.RibbonControl.Location = New System.Drawing.Point(0, 0) - Me.RibbonControl.MaxItemId = 18 + Me.RibbonControl.MaxItemId = 19 Me.RibbonControl.Name = "RibbonControl" Me.RibbonControl.PageCategories.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageCategory() {Me.RibbonPageCategoryEntityDesigner}) Me.RibbonControl.PageHeaderItemLinks.Add(Me.SkinDropDownButtonItem1) @@ -200,6 +202,12 @@ Partial Class frmMain Me.WorkspaceManager1.TargetControl = Me Me.WorkspaceManager1.TransitionType = PushTransition1 ' + 'LabelServiceOnline + ' + Me.LabelServiceOnline.Caption = "BarStaticItem1" + Me.LabelServiceOnline.Id = 18 + Me.LabelServiceOnline.Name = "LabelServiceOnline" + ' 'RibbonPageCategoryEntityDesigner ' Me.RibbonPageCategoryEntityDesigner.AutoStretchPageHeaders = True @@ -271,6 +279,7 @@ Partial Class frmMain Me.RibbonStatusBar.ItemLinks.Add(Me.LabelCurrentMachine) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelCurrentVersion) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelCurrentLanguage) + Me.RibbonStatusBar.ItemLinks.Add(Me.LabelServiceOnline) Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 556) Me.RibbonStatusBar.Name = "RibbonStatusBar" Me.RibbonStatusBar.Ribbon = Me.RibbonControl @@ -436,4 +445,5 @@ Partial Class frmMain Friend WithEvents BarButtonItem2 As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarWorkspaceMenuItem1 As DevExpress.XtraBars.BarWorkspaceMenuItem Friend WithEvents WorkspaceManager1 As DevExpress.Utils.WorkspaceManager + Friend WithEvents LabelServiceOnline As DevExpress.XtraBars.BarStaticItem End Class diff --git a/EDMI_ClientSuite/frmMain.vb b/EDMI_ClientSuite/frmMain.vb index 0d160e77..804248fb 100644 --- a/EDMI_ClientSuite/frmMain.vb +++ b/EDMI_ClientSuite/frmMain.vb @@ -13,17 +13,33 @@ Public Class frmMain ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() - ' Assign My.MainForm before everything else - My.MainForm = Me - - ' Initialize Main Timer - _Timer = New ClassTimer(My.LogConfig) - ' Show splashscreen frmSplash.ShowDialog() + + ' Initialize Form Related Variables + My.MainForm = Me + End Sub + + Private Sub SetOnlineLabel() + If My.Application.Service.Online Then + LabelServiceOnline.Caption = "Service Online" + LabelServiceOnline.ItemAppearance.Normal.ForeColor = Color.Green + Else + LabelServiceOnline.Caption = "Service Offline" + LabelServiceOnline.ItemAppearance.Normal.ForeColor = Color.Red + End If + End Sub + + Private Sub HandleOnlineChanged(sender As Object, Online As Boolean) + SetOnlineLabel() End Sub Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load + ' Initialize Main Timer + _Timer = New ClassTimer(My.LogConfig, Me, My.Config.HeartbeatInterval) + AddHandler _Timer.OnlineChanged, AddressOf HandleOnlineChanged + SetOnlineLabel() + LabelCurrentUser.Caption = My.Application.User.UserName LabelCurrentMachine.Caption = My.Application.User.MachineName LabelCurrentVersion.Caption = My.Application.Info.Version.ToString @@ -48,7 +64,6 @@ Public Class frmMain MsgBox($"Clicked on Document {RowView.Row.Item("DocName")}") End Sub - LoadLayout() End Sub @@ -57,21 +72,21 @@ Public Class frmMain End Sub Private Sub LoadLayout() - Dim oLayoutPathForDockManager As String = GetLayoutPath(LayoutName.LayoutMain, LayoutComponent.DockManager) - Dim oLayoutPathForDocumentManager As String = GetLayoutPath(LayoutName.LayoutMain, LayoutComponent.DocumentManager) + Dim oLayoutPathForDockManager As String = GetLayoutPath(GroupName.LayoutMain, LayoutComponent.DockManager) + Dim oLayoutPathForDocumentManager As String = GetLayoutPath(GroupName.LayoutMain, LayoutComponent.DocumentManager) - If IO.File.Exists(oLayoutPathForDockManager) Then + If File.Exists(oLayoutPathForDockManager) Then DockManager.RestoreLayoutFromXml(oLayoutPathForDockManager) End If - If IO.File.Exists(oLayoutPathForDocumentManager) Then + If File.Exists(oLayoutPathForDocumentManager) Then DocumentManager.View.RestoreLayoutFromXml(oLayoutPathForDocumentManager) End If End Sub Private Sub SaveLayout() - Dim oLayoutPathForDockManager As String = GetLayoutPath(LayoutName.LayoutMain, LayoutComponent.DockManager) - Dim oLayoutPathForDocumentManager As String = GetLayoutPath(LayoutName.LayoutMain, LayoutComponent.DocumentManager) - Dim oDirectory As String = Path.GetDirectoryName(oLayoutPathForDockManager) + Dim oLayoutPathForDockManager As String = GetLayoutPath(GroupName.LayoutMain, LayoutComponent.DockManager) + Dim oLayoutPathForDocumentManager As String = GetLayoutPath(GroupName.LayoutMain, LayoutComponent.DocumentManager) + Dim oDirectory As String = GetLayoutDirectory() If Not Directory.Exists(oDirectory) Then Directory.CreateDirectory(oDirectory) diff --git a/EDMI_ClientSuite/frmSplash.vb b/EDMI_ClientSuite/frmSplash.vb index ff5677bb..15d29bdd 100644 --- a/EDMI_ClientSuite/frmSplash.vb +++ b/EDMI_ClientSuite/frmSplash.vb @@ -49,6 +49,12 @@ Public NotInheritable Class frmSplash End Function #Region "Worker" + Private Enum WorkerResult + AllGood + ServiceOffline + End Enum + + Private Sub StartWorker() AddHandler _Worker.DoWork, AddressOf bw_DoWork AddHandler _Worker.ProgressChanged, AddressOf bw_ProgressChanged @@ -58,17 +64,25 @@ Public NotInheritable Class frmSplash _Worker.RunWorkerAsync() End Sub - Private Sub bw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) + Private Async Sub bw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Dim oService As New ClassService(My.LogConfig) _Worker.ReportProgress(SetProgress(1), "Connecting to service..") - Dim oChannelFactory As ChannelFactory(Of IEDMServiceChannel) - Dim oChannel As IEDMServiceChannel Dim oConnectionSuccessful = False - oChannelFactory = oService.GetChannelFactory() - oChannel = oChannelFactory.CreateChannel() + e.Result = WorkerResult.AllGood + + _ChannelFactory = oService.GetChannelFactory() + _Channel = _ChannelFactory.CreateChannel() + + 'Dim oServiceOnline = Await oService.TestConnectionAsync() + Dim oServiceState = oService.TestConnection() + + If oServiceState <> ClassService.ConnectionTestResult.Successful Then + e.Result = WorkerResult.ServiceOffline + Return + End If Thread.Sleep(SLEEP_TIME) @@ -92,11 +106,25 @@ Public NotInheritable Class frmSplash Private Sub bw_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) ' Bei Fehler MsgBox anzeigen und Programm beenden If e.Error IsNot Nothing Then - 'ClassLogger.Add("Unexpected error in Initializing application....") - MsgBox(e.Error.Message, MsgBoxStyle.Critical, "Critical Error") + MsgBox(e.Error.Message, MsgBoxStyle.Critical, "Unhandled Error") + Application.Exit() + ElseIf e.Result <> WorkerResult.AllGood Then + Dim oErrorMessage + + Select Case e.Result + Case WorkerResult.ServiceOffline + oErrorMessage = "Service is offline!" + Case Else + oErrorMessage = "Unknown Error" + End Select + + MsgBox($"Application could not be started{vbNewLine}Reason: {oErrorMessage}", MsgBoxStyle.Critical, "Critical Error") Application.Exit() End If + My.ChannelFactory = _ChannelFactory + My.Channel = _Channel + ' Wenn kein Fehler, Splashscreen schließen Me.Close() End Sub diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult.datasource index 92381800..37ec8092 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult + DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ContainerResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource index 1ded1ec6..f729e1d8 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult + DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource index 972a9621..7a412454 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult + DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource index 21ec4794..afc8fe42 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult + DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.wsdl b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.wsdl index 2fd4ed52..47d71092 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.wsdl +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.wsdl @@ -9,6 +9,12 @@ + + + + + + @@ -64,6 +70,10 @@ + + + + diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.xsd b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.xsd index dcec368e..29f05a8b 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.xsd +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Services.EDMService.xsd @@ -1,6 +1,18 @@  + + + + + + + + + + + + diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/Reference.vb b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/Reference.vb index 9d037d69..04d51826 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/Reference.vb +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/Reference.vb @@ -427,6 +427,12 @@ Namespace EDMIServiceReference System.ServiceModel.ServiceContractAttribute([Namespace]:="http://DigitalData.Services.EDMService", ConfigurationName:="EDMIServiceReference.IEDMService")> _ Public Interface IEDMService + _ + Function Heartbeat() As Boolean + + _ + Function HeartbeatAsync() As System.Threading.Tasks.Task(Of Boolean) + _ Function CreateDatabaseRequest(ByVal Name As String, ByVal Debug As Boolean) As String @@ -513,6 +519,14 @@ Namespace EDMIServiceReference MyBase.New(binding, remoteAddress) End Sub + Public Function Heartbeat() As Boolean Implements EDMIServiceReference.IEDMService.Heartbeat + Return MyBase.Channel.Heartbeat + End Function + + Public Function HeartbeatAsync() As System.Threading.Tasks.Task(Of Boolean) Implements EDMIServiceReference.IEDMService.HeartbeatAsync + Return MyBase.Channel.HeartbeatAsync + End Function + Public Function CreateDatabaseRequest(ByVal Name As String, ByVal Debug As Boolean) As String Implements EDMIServiceReference.IEDMService.CreateDatabaseRequest Return MyBase.Channel.CreateDatabaseRequest(Name, Debug) End Function diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/service.wsdl b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/service.wsdl index 520b3f35..a655416c 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/service.wsdl +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/service.wsdl @@ -39,6 +39,15 @@ + + + + + + + + + diff --git a/SERVICES/DDEDM_NetworkService/EDMService.vb b/SERVICES/DDEDM_NetworkService/EDMService.vb index 22cca182..5c670a1e 100644 --- a/SERVICES/DDEDM_NetworkService/EDMService.vb +++ b/SERVICES/DDEDM_NetworkService/EDMService.vb @@ -17,18 +17,25 @@ Public Class EDMService Private _request As Request = Nothing Private _debug As Boolean = False + Private _username As String Public Sub New() Dim oOperationContext As OperationContext = OperationContext.Current Dim oInstanceContext As InstanceContext = oOperationContext.InstanceContext Dim oUsername = oOperationContext.ServiceSecurityContext.WindowsIdentity.Name + _username = oUsername _logger = LogConfig.GetLogger() End Sub +#Region "Heartbeat" + Public Function Heartbeat() As Boolean Implements IEDMService.Heartbeat + Return True + End Function +#End Region #Region "Request" Public Function CreateDatabaseRequest(Name As String, Optional Debug As Boolean = False) As String Implements IEDMService.CreateDatabaseRequest - _request = New Request(Name, _session.Username, Database, Debug) + _request = New Request(Name, _username, Database, Debug) _debug = Debug _logger.Info("Creating request {0}/{1}", _request.Name, _request.RequestId) diff --git a/SERVICES/DDEDM_NetworkService/IEDMService.vb b/SERVICES/DDEDM_NetworkService/IEDMService.vb index 00aecbae..afc90e45 100644 --- a/SERVICES/DDEDM_NetworkService/IEDMService.vb +++ b/SERVICES/DDEDM_NetworkService/IEDMService.vb @@ -4,6 +4,11 @@ Imports DigitalData.Modules.Filesystem Interface IEDMService +#Region "Heartbeat" + + Function Heartbeat() As Boolean +#End Region + #Region "Database" Function CreateDatabaseRequest(Name As String, Optional Debug As Boolean = False) As String diff --git a/SERVICES/DDEDM_NetworkService/WindowsService.vb b/SERVICES/DDEDM_NetworkService/WindowsService.vb index 16830755..c6d2eb51 100644 --- a/SERVICES/DDEDM_NetworkService/WindowsService.vb +++ b/SERVICES/DDEDM_NetworkService/WindowsService.vb @@ -15,7 +15,6 @@ Public Class WindowsService Private _logger As Logger Private _db As Firebird Private _clientsConnected As Integer = 0 - Private _clients As New List(Of Session) Private _config As AppConfig Public Sub New() @@ -46,9 +45,6 @@ Public Class WindowsService _logger.Info("Successfully connected to database!") - AddHandler EDMService.ClientConnectedEvent, AddressOf EDMService_ClientConnected - AddHandler EDMService.ClientDisconnectedEvent, AddressOf EDMService_ClientDisonnected - EDMService.Database = _db EDMService.LogConfig = _logConfig EDMService.AppConfig = _config @@ -66,18 +62,6 @@ Public Class WindowsService End Try End Sub - Private Sub EDMService_ClientDisonnected(sender As Object, e As Session) - _clientsConnected -= 1 - _clients.Remove(e) - _logger.Info("Client {0}/{1} disconnected! Total {2}", e.Username, e.SessionId, _clientsConnected) - End Sub - - Private Sub EDMService_ClientConnected(sender As Object, e As Session) - _clientsConnected += 1 - _clients.Add(e) - _logger.Info("Client {0}/{1} connected! Total {2}", e.Username, e.SessionId, _clientsConnected) - End Sub - Protected Overrides Sub OnStop() If _serviceHost IsNot Nothing Then _serviceHost.Close()