.Net Remoting

10/12/2008 - 07:45 von andi rickenbach | Report spam
Hallo

Ich versuche mit vb.net und .net Remoting folgendes System aufzubauen:

- Serverapplikation bzw. Service auf einem IIS hosten, damit Clients
entweder über http durchs Internet zugreifen können oder intern über tcp.
Dieser Service, nenne ich mal DB.dll und wird eben auf dem IIS gehostet,
enthàlt alle Methoden welche nötig sind um auf die Server-Datenbank
zuzugreifen und Daten abzurufen.

- Clientapplikation welche über http von extern oder über tcp wenn sie
intern auf
einem PC installiert wird, auf die Server-Datenbank zugreift.

- Die Clientapplikation soll nun aber auch lokal auf eine Datenbank
zugreifen können. Das heisst je nach Wunsch kann man sich mit dem Client über
http oder tcp auf die Server-Datenbank verbinden, es soll aber auch möglich
sein auf eine lokale Datenbank zuzugreifen. Die sogenannte DB.dll welche alle
Zugriffe auf die Datenbank ermöglichen soll, möchte ich für alle Varianten
verwenden. Das
heisst sie ist auf dem IIS notwendig, sowie in der Clientapplikation. Hier
stellt sich die Frage ob das funktioniert bzw. ob eine Klasse, welche von
MarshalByRefObject erbt, auch ganz normal lokal ohne remoting zu benutzen ist.

Nachfolgend meine Vorstellung wie ich das sehen würde (einfach mal über
http...der Rest bzw. alle Konfigurationen sind dann fleissarbeit), hier die
Fragen dazu:

- Bin ich grundsàtzlich mit dem Konzept auf dem richtigen weg?
- Kann die Klasse DBMain bzw. DB.dll obwohl die Klasse mit Inherits
MarshalByRefObject
deklariert ist auch lokal für den Client ohne Remoting benutzen? Ist mir
klar das ich dafür im Client die deklarationen für das Remoting weglassen
muss und die Klasse normal Instanzieren. Es geht mir nur um das
Grundsàtzliche.
- Das ganze soll dann auch noch über ein sauberes Interface laufen, denke
aber das sollte nirgens ein Problem darstellen, oder?
- Warum muss ich die Klasse DBBaseImpl auch mit Inherits MarshalByRefObject
deklarieren? Wenn ich das nicht mache, funktioniert die Applikation nicht?
- Ich muss mir dann über CAO und SAO sicher noch gedanken machen.


Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Public Class Server
Public Shared Sub Main()
Dim ServiceChannel As IChannel
Dim serverProv As BinaryServerFormatterSinkProvider = New
BinaryServerFormatterSinkProvider
Dim Props As IDictionary = New Hashtable
Props("port") = "8989"
ServiceChannel = New HttpChannel(Props, Nothing, serverProv)
ChannelServices.RegisterChannel(ServiceChannel, False)

RemotingConfiguration.RegisterWellKnownServiceType(GetType(DB.DBMain),
"DBMain.rem", WellKnownObjectMode.Singleton)

Console.WriteLine("Listening for requests. Press enter to exit...")
Console.ReadLine()
End Sub
End Class




'Klasse DBMain

Imports System
Imports DB.DBAccess
Imports DB.DBCommon
Public Class DBMain
Inherits MarshalByRefObject
Public DBSystem As DBBaseImpl
Public Function ConnectDatabase() As Boolean
Try
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory)
Dim DBAccessImpl As DBAccessImpl =
DBAccess.DBAccessImpl.GetInstance
Dim IDBAccess As IDBAccess = DBAccessImpl
If IDBAccess.SetDBConnection() = False Then
Return False
End If
DBSystem = DBAccessImpl
DBSystem.OpenDatabase()
Return True
Catch ex As Exception
Return False
End Try
End Function
End Class

'Klasse DBBaseImpl
Imports DB.DBAccess
Imports PublicObjects
Imports System.Data.Common

Namespace DBCommon

Public MustInherit Class DBBaseImpl
Inherits MarshalByRefObject

Private m_DBConnection As Global.System.Data.Common.DbConnection

Public MustOverride Function GetNewDBCommand() As
Global.System.Data.Common.DbCommand

Public Function OpenDatabase() As Boolean
If DBConn Is Nothing Then
Return False
Else
If DBConn.State = ConnectionState.Closed Then
DBConn.Open()
End If
End If
Return True
End Function

Public Function GetNames() As List(Of typeName)
Dim Command As DbCommand = GetNewDBCommand()
Command.Connection = DBConn
Command.CommandText = "SELECT * From T_Test"
Dim DBDataReader As DbDataReader = Command.ExecuteReader()
Dim NamesList As List(Of typeName) = New List(Of typeName)
While DBDataReader.Read
Dim Name As typeName = New typeName(DBDataReader.Item("Name"))
NamesList.Add(Name)
End While
DBDataReader.Close()
Return NamesList
End Function

Protected Property DBConn() As Global.System.Data.Common.DbConnection
Get
Return m_DBConnection
End Get
Set(ByVal value As Global.System.Data.Common.DbConnection)
m_DBConnection = value
End Set
End Property

End Class

End Namespace

'Klasse DBAccessImpl

Imports DB.DBCommon
Imports System.Data.Common

Namespace DBAccess

Public Class DBAccessImpl
Inherits DBBaseImpl
Implements IDBAccess

Private m_sDBConnectionString As String
Private Const PROVIDER As String = "Microsoft.Jet.OLEDB.4.0"

Private Sub New()

End Sub

Public Shared Function GetInstance() As DBAccessImpl
Return New DBAccessImpl()
End Function

Public Function SetDBConnection() As Boolean Implements
IDBAccess.SetDBConnection
Try
DBConnectionString = GetConnectionString()
DBConn = New OleDb.OleDbConnection(DBConnectionString)
Return True
Catch ex As Exception
Return False
End Try
End Function

Private Function GetConnectionString() As String
Try
Return "Provider=" & PROVIDER & _
";Data Source=" & "test.mdb" & _
";Jet OLEDB:Database Password=" & ""
& _
";Password=" & _
";User ID=Admin" & _
";Mode=Share Deny None" & _
";Extended Properties=" & _
";Jet OLEDB:System database=" & _
";OLE DB Services = -4" & _
";Jet OLEDB:Registry Path=" & _
";Jet OLEDB:Engine Type=5" & _
";Jet OLEDB:Database Locking Mode=1"
& _
";Jet OLEDB:Global Partial Bulk
Ops=2" & _
";Jet OLEDB:Global Bulk
Transactions=1" & _
";Jet OLEDB:New Database Password=" & _
";Jet OLEDB:Create System
Database=False" & _
";Jet OLEDB:Encrypt Database=False" & _
";Jet OLEDB:Don't Copy Locale on
Compact=False" & _
";Jet OLEDB:Compact Without Replica
Repair=False" & _
";Jet OLEDB:SFP=False"
Catch ex As Exception
Return ""
End Try
End Function

Public Overrides Function GetNewDBCommand() As
Global.System.Data.Common.DbCommand
Try
Return New OleDb.OleDbCommand
Catch ex As Exception
Return Nothing
End Try
End Function

Property DBConnectionString() As String
Get
Return m_sDBConnectionString
End Get
Set(ByVal value As String)
m_sDBConnectionString = value
End Set
End Property

End Class

End Namespace




Client--
Imports System
Imports System.Runtime.Remoting
Imports PublicObjects
Imports DB
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http

Public Class Client

Public Shared Sub Main()
Dim Channel As System.Runtime.Remoting.Channels.Http.HttpChannel
Dim clientProv As BinaryClientFormatterSinkProvider
Dim props As IDictionary = New Hashtable

clientProv = New BinaryClientFormatterSinkProvider
Channel = New HttpChannel(props, clientProv, Nothing)
ChannelServices.RegisterChannel(Channel, False)

Dim DBMain As DB.DBMain =
CType(Activator.GetObject(GetType(DB.DBMain),
"http://Localhost:8989/DBMain.rem"), DB.DBMain)
Console.WriteLine(DBMain.ConnectDatabase.ToString)

Dim NamesList As List(Of typeName) = DBMain.DBSystem.GetNames
For Each name As typeName In NamesList
Console.WriteLine(name.LastName)
Next

Console.ReadLine()
End Sub
End Class


Vielen Dank.
 

Lesen sie die antworten

#1 Volker Strähle
10/12/2008 - 15:55 | Warnen spam
Warum erstellst Du nicht einfach eine Webservice, wenn Du sowieso IIS
verwenden willst?


"andi rickenbach" schrieb im
Newsbeitrag news:
Hallo

Ich versuche mit vb.net und .net Remoting folgendes System aufzubauen:

- Serverapplikation bzw. Service auf einem IIS hosten, damit Clients
entweder über http durchs Internet zugreifen können oder intern über tcp.
Dieser Service, nenne ich mal DB.dll und wird eben auf dem IIS gehostet,
enthàlt alle Methoden welche nötig sind um auf die Server-Datenbank
zuzugreifen und Daten abzurufen.

- Clientapplikation welche über http von extern oder über tcp wenn sie
intern auf
einem PC installiert wird, auf die Server-Datenbank zugreift.

- Die Clientapplikation soll nun aber auch lokal auf eine Datenbank
zugreifen können. Das heisst je nach Wunsch kann man sich mit dem Client
über
http oder tcp auf die Server-Datenbank verbinden, es soll aber auch
möglich
sein auf eine lokale Datenbank zuzugreifen. Die sogenannte DB.dll welche
alle
Zugriffe auf die Datenbank ermöglichen soll, möchte ich für alle Varianten
verwenden. Das
heisst sie ist auf dem IIS notwendig, sowie in der Clientapplikation. Hier
stellt sich die Frage ob das funktioniert bzw. ob eine Klasse, welche von
MarshalByRefObject erbt, auch ganz normal lokal ohne remoting zu benutzen
ist.

Nachfolgend meine Vorstellung wie ich das sehen würde (einfach mal über
http...der Rest bzw. alle Konfigurationen sind dann fleissarbeit), hier
die
Fragen dazu:

- Bin ich grundsàtzlich mit dem Konzept auf dem richtigen weg?
- Kann die Klasse DBMain bzw. DB.dll obwohl die Klasse mit Inherits
MarshalByRefObject
deklariert ist auch lokal für den Client ohne Remoting benutzen? Ist mir
klar das ich dafür im Client die deklarationen für das Remoting weglassen
muss und die Klasse normal Instanzieren. Es geht mir nur um das
Grundsàtzliche.
- Das ganze soll dann auch noch über ein sauberes Interface laufen, denke
aber das sollte nirgens ein Problem darstellen, oder?
- Warum muss ich die Klasse DBBaseImpl auch mit Inherits
MarshalByRefObject
deklarieren? Wenn ich das nicht mache, funktioniert die Applikation nicht?
- Ich muss mir dann über CAO und SAO sicher noch gedanken machen.


Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Public Class Server
Public Shared Sub Main()
Dim ServiceChannel As IChannel
Dim serverProv As BinaryServerFormatterSinkProvider = New
BinaryServerFormatterSinkProvider
Dim Props As IDictionary = New Hashtable
Props("port") = "8989"
ServiceChannel = New HttpChannel(Props, Nothing, serverProv)
ChannelServices.RegisterChannel(ServiceChannel, False)

RemotingConfiguration.RegisterWellKnownServiceType(GetType(DB.DBMain),
"DBMain.rem", WellKnownObjectMode.Singleton)

Console.WriteLine("Listening for requests. Press enter to exit...")
Console.ReadLine()
End Sub
End Class




'Klasse DBMain

Imports System
Imports DB.DBAccess
Imports DB.DBCommon
Public Class DBMain
Inherits MarshalByRefObject
Public DBSystem As DBBaseImpl
Public Function ConnectDatabase() As Boolean
Try
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory)
Dim DBAccessImpl As DBAccessImpl > DBAccess.DBAccessImpl.GetInstance
Dim IDBAccess As IDBAccess = DBAccessImpl
If IDBAccess.SetDBConnection() = False Then
Return False
End If
DBSystem = DBAccessImpl
DBSystem.OpenDatabase()
Return True
Catch ex As Exception
Return False
End Try
End Function
End Class

'Klasse DBBaseImpl
Imports DB.DBAccess
Imports PublicObjects
Imports System.Data.Common

Namespace DBCommon

Public MustInherit Class DBBaseImpl
Inherits MarshalByRefObject

Private m_DBConnection As Global.System.Data.Common.DbConnection

Public MustOverride Function GetNewDBCommand() As
Global.System.Data.Common.DbCommand

Public Function OpenDatabase() As Boolean
If DBConn Is Nothing Then
Return False
Else
If DBConn.State = ConnectionState.Closed Then
DBConn.Open()
End If
End If
Return True
End Function

Public Function GetNames() As List(Of typeName)
Dim Command As DbCommand = GetNewDBCommand()
Command.Connection = DBConn
Command.CommandText = "SELECT * From T_Test"
Dim DBDataReader As DbDataReader = Command.ExecuteReader()
Dim NamesList As List(Of typeName) = New List(Of typeName)
While DBDataReader.Read
Dim Name As typeName = New
typeName(DBDataReader.Item("Name"))
NamesList.Add(Name)
End While
DBDataReader.Close()
Return NamesList
End Function

Protected Property DBConn() As
Global.System.Data.Common.DbConnection
Get
Return m_DBConnection
End Get
Set(ByVal value As Global.System.Data.Common.DbConnection)
m_DBConnection = value
End Set
End Property

End Class

End Namespace

'Klasse DBAccessImpl

Imports DB.DBCommon
Imports System.Data.Common

Namespace DBAccess

Public Class DBAccessImpl
Inherits DBBaseImpl
Implements IDBAccess

Private m_sDBConnectionString As String
Private Const PROVIDER As String = "Microsoft.Jet.OLEDB.4.0"

Private Sub New()

End Sub

Public Shared Function GetInstance() As DBAccessImpl
Return New DBAccessImpl()
End Function

Public Function SetDBConnection() As Boolean Implements
IDBAccess.SetDBConnection
Try
DBConnectionString = GetConnectionString()
DBConn = New OleDb.OleDbConnection(DBConnectionString)
Return True
Catch ex As Exception
Return False
End Try
End Function

Private Function GetConnectionString() As String
Try
Return "Provider=" & PROVIDER & _
";Data Source=" & "test.mdb" & _
";Jet OLEDB:Database Password=" & ""
& _
";Password=" & _
";User ID=Admin" & _
";Mode=Share Deny None" & _
";Extended Properties=" & _
";Jet OLEDB:System database=" & _
";OLE DB Services = -4" & _
";Jet OLEDB:Registry Path=" & _
";Jet OLEDB:Engine Type=5" & _
";Jet OLEDB:Database Locking Mode=1"
& _
";Jet OLEDB:Global Partial Bulk
Ops=2" & _
";Jet OLEDB:Global Bulk
Transactions=1" & _
";Jet OLEDB:New Database Password="
& _
";Jet OLEDB:Create System
Database=False" & _
";Jet OLEDB:Encrypt Database=False"
& _
";Jet OLEDB:Don't Copy Locale on
Compact=False" & _
";Jet OLEDB:Compact Without Replica
Repair=False" & _
";Jet OLEDB:SFP=False"
Catch ex As Exception
Return ""
End Try
End Function

Public Overrides Function GetNewDBCommand() As
Global.System.Data.Common.DbCommand
Try
Return New OleDb.OleDbCommand
Catch ex As Exception
Return Nothing
End Try
End Function

Property DBConnectionString() As String
Get
Return m_sDBConnectionString
End Get
Set(ByVal value As String)
m_sDBConnectionString = value
End Set
End Property

End Class

End Namespace




Client--
Imports System
Imports System.Runtime.Remoting
Imports PublicObjects
Imports DB
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http

Public Class Client

Public Shared Sub Main()
Dim Channel As System.Runtime.Remoting.Channels.Http.HttpChannel
Dim clientProv As BinaryClientFormatterSinkProvider
Dim props As IDictionary = New Hashtable

clientProv = New BinaryClientFormatterSinkProvider
Channel = New HttpChannel(props, clientProv, Nothing)
ChannelServices.RegisterChannel(Channel, False)

Dim DBMain As DB.DBMain > CType(Activator.GetObject(GetType(DB.DBMain),
"http://Localhost:8989/DBMain.rem"), DB.DBMain)
Console.WriteLine(DBMain.ConnectDatabase.ToString)

Dim NamesList As List(Of typeName) = DBMain.DBSystem.GetNames
For Each name As typeName In NamesList
Console.WriteLine(name.LastName)
Next

Console.ReadLine()
End Sub
End Class


Vielen Dank.

Ähnliche fragen