Imports System.Collections.Generic Imports System.Net Imports System.Net.Http Imports System.Web.Http Imports System.Web.Http.Description Imports System.Data Imports Windream.WebService.WebAPI.PlugIns Imports Windream.WebService.Documents Imports WMOBRWSLib Imports WINDREAMLib Imports WMCNNCTDLLLib Imports DD_LIB_Standards.clsDatabase Imports NLog Imports NLog.Targets Imports NLog.Config Imports System.Reflection Imports System.Xml Imports System.Net.Http.Headers Imports System.Threading Imports System.Threading.Tasks Imports System.Web.Http.Controllers Namespace Controllers Public Class DigitalDataController Inherits PlugInBaseController Private _routesSettings As IEnumerable(Of RouteSettings) Private _docController As IDocumentsController Private _session As IWMSession6 Private _logger As Logger ''' ''' Gets the routes settings for the controller. ''' This property will automatically be called from the windream Web Service - WebAPI framework. ''' ''' ''' The routes settings of the controller. ''' Public Overrides ReadOnly Property RoutesSettings As IEnumerable(Of RouteSettings) Get Return _routesSettings End Get End Property Public Overrides Function ExecuteAsync(controllerContext As HttpControllerContext, cancellationToken As CancellationToken) As Task(Of HttpResponseMessage) Return MyBase.ExecuteAsync(controllerContext, cancellationToken) End Function ''' ''' Initializes a new instance of the class. ''' Sub New() Dim routesSettings As List(Of RouteSettings) = New List(Of RouteSettings)() routesSettings.Add(New RouteSettings("DigitalDataController", "DigitalData/{action}/{id}", New With {.id = RouteParameter.Optional, .controller = "DigitalData"})) _routesSettings = routesSettings Dim config = New LoggingConfiguration() Dim fileTarget = New FileTarget() With { .Name = "BNSPlugin", .ArchiveEvery = FileArchivePeriod.Day, .FileName = "D:/ProgramFiles/DigitalData/SERVICES/WMWebServiceBNS/Log/${date:format=yyyy-MM-dd}-WMWebServiceBNS.txt", .Layout = "${longdate} || ${message}" } config.AddTarget("file", fileTarget) Dim rule = New LoggingRule("*", LogLevel.Debug, fileTarget) config.LoggingRules.Add(rule) LogManager.Configuration = config _logger = LogManager.GetLogger("DigitalDataController") Dim connectionString = GetConnectionString() _logger.Info($"[DATABASE] Verbindung zu {connectionString}") Dim dbInit = Init(connectionString) If dbInit = False Then _logger.Info("[DATABASE] Die Verbindung zur Datenbank konnte nicht hergestellt werden.") Else _logger.Info("[DATABASE] Die Verbindung zur Datenbank wurde hergestellt.") End If _logger.Info("[INIT] Die Initialisierung wurde abgeschlossen.") End Sub Private Function GetPluginPath() Dim s = Assembly.GetExecutingAssembly().CodeBase s = New Uri(s).AbsolutePath s = Uri.UnescapeDataString(s) s = IO.Path.GetFullPath(s) s = IO.Path.GetDirectoryName(s) Return s End Function Private Function GetConnectionString() Dim path As String = GetPluginPath() Dim configFile = path & "\config.xml" If IO.File.Exists(configFile) Then Dim Doc As XmlDocument = New XmlDocument() Doc.Load(configFile) Dim connectionString As String = Doc.DocumentElement.SelectSingleNode("/config/connectionString").InnerText _logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde gefunden") Return connectionString Else _logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde NICHT gefunden!") Return Nothing End If End Function ''' ''' A simple example of a http-get service method implementation. ''' ''' windream Document-ID ''' windream User-ID ''' This method creates a nice greeting. ' Public Function BNSDownload( docId As Integer, userId As String) As HttpResponseMessage Dim DT As DataTable Dim Domain, Username, Password As String _logger.Info($"[REQUEST] Anfrage von Benutzer-ID {userId} für Dokument-ID {docId}") Try DT = Return_Datatable($"SELECT DOMAIN, USERNAME, PW FROM TBDD_WEBSERVICE_USER_EX WHERE USERNAME_LINK = '{userId}'") Catch ex As Exception _logger.Info("[DATABASE] Fehler beim Zugriff auf die Datenbank ") _logger.Info(ex.Message) Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError) End Try If DT.Rows.Count = 0 Then _logger.Info($"[DATABASE] BenutzerID {userId} wurde nicht in der Datenbank gefunden.") Return CreateResponseMessage(Request, $"Benutzer {userId} wurde nicht gefunden", HttpStatusCode.Unauthorized) Else Dim firstRow As DataRow = DT.Rows.Item(0) Domain = firstRow.Item("DOMAIN") Username = firstRow.Item("USERNAME") Password = firstRow.Item("PW") _logger.Info($"[DATABASE] BenutzerID {userId} wurde gefunden.") End If Dim loggedIn As Boolean = CreateSessionForUser(Username, Password, Domain) If Not loggedIn Then Return CreateResponseMessage(Request, $"Session für Benutzer {userId} konnte nicht aufgebaut werden. Weitere Informationen im Log", HttpStatusCode.BadRequest) End If Dim WMDoc As IWMObject7 Dim WMStream As IWMStream Dim fileContent As Byte() Try WMDoc = _session.GetWMObjectById(WMEntity.WMEntityDocument, docId) Catch ex As Exception _logger.Info("[WINDREAM/GetWMObjectById] Ein Fehler beim Zugriff auf Windream ist aufgetreten ") _logger.Info(ex.Message) _logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen") _session.Logout() Return CreateResponseMessage(Request, "Document not found", HttpStatusCode.NotFound) End Try Try WMStream = WMDoc.OpenStream("BinaryObject", WMObjectStreamOpenMode.WMObjectStreamOpenModeRead) fileContent = WMStream.Read(WMStream.GetSize()) Catch ex As Exception _logger.Info("[WINDREAM/OpenStream] Ein Fehler beim Zugriff auf Windream ist aufgetreten") _logger.Info(ex.Message) _logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen") _session.Logout() Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError) End Try _logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen") _session.Logout() ' Gibt die Datei zum Download zurück Return CreateFileResponseMessage(fileContent, WMDoc.aName) End Function Private Function CreateFileResponseMessage(data As Byte(), filename As String) As HttpResponseMessage _logger.Info($"[WINDREAM/Download] Datei {filename} wird für Download zur Verfügung gestellt") Dim Res = New HttpResponseMessage() Res.StatusCode = HttpStatusCode.OK Res.Content = New ByteArrayContent(data) Res.Content.Headers.ContentType = New MediaTypeHeaderValue("application/octet-stream") Res.Content.Headers.ContentDisposition = New ContentDispositionHeaderValue("attachment") With { .FileName = filename } Return Res End Function Private Function CreateSessionForUser(username As String, password As String, domain As String) Dim WMServerBrowser As New ServerBrowser() Dim DMSServer As String Dim Connect As IWMConnect2 Dim Session As IWMSession6 Dim User As WMOTOOLLib.WMUserIdentity Try '' Get the current Windream Server DMSServer = WMServerBrowser.GetCurrentServer() Catch ex As Exception _logger.Info($"[WINDREAM/ServerBrowser] DMS Server konnte nicht ausgelesen werden.") _logger.Info(ex.Message) Return False End Try Try ' Create a User Object for Session User = New WMOTOOLLib.WMUserIdentity() User.aDomain = domain User.aPassword = password User.aUserName = username User.aServerName = DMSServer Catch ex As Exception _logger.Info($"[WINDREAM/User] User Objekt konnte nicht erstellt werden.") _logger.Info(ex.Message) Return False End Try _logger.Info("[WINDREAM/Session] Session wird aufgebaut") _logger.Info($"[WINDREAM/Session] Username: {username}") _logger.Info($"[WINDREAM/Session] Passwort: {password}") _logger.Info($"[WINDREAM/Session] Domäne: {domain}") _logger.Info($"[WINDREAM/Session] Windream Server: {DMSServer}") Try ' Create Connect Object for Session Connect = New WMConnect() Connect.ModuleId = 9 Catch ex As Exception _logger.Info($"[WINDREAM/Connect] Connect Objekt konnte nicht erstellt werden.") _logger.Info(ex.Message) Return False End Try Try Session = Connect.Login(User) _logger.Info($"[WINDREAM/Session] Session wurde aufgebaut") If Session.aLoggedin Then _session = Session _logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt") Return True Else _logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!") Return False End If Catch ex As Exception _logger.Info($"[WINDREAM/Session] Fehler bei Login von Benutzer {username}!") _logger.Info(ex.Message) If Not IsNothing(Session) AndAlso Session.aLoggedin Then _session = Session _logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt") Return True Else _logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!") _logger.Info(ex.Message) Return False End If End Try End Function End Class End Namespace