tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1880
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Hallo Leute,

    ich habe eine organisatorische Frage bezüglich Webservices unter ASP.NET:
    Ich möchte einen Webservice schreiben, welcher verschiedene MySQL Operationen zur Verfügung stellt.

    Jetzt habe ich eine "Connect()", eine "Verify()", eine "Read()" und eine "Disconnect()" Funktion geschrieben und gemerkt, dass wenn ich eine global gesetzte Verbindungsvariable per Connect() eine Verbindung aufbauen lasse, sie in Verify() und den anderen nicht mehr zur Verfügung steht.

    Kann man das anders lösen oder MUSS ich zwingend pro Funktionsaufruf die Verbindung neu herstellen (Das ist etwas doof, weil ein Zugriff alle paar Sekunden stattfinden soll!)

    Danke für eure Antworten,
    schöne Grüße,
    Jonathan


    PS: Der Webservice wird von einem VB.NET Programm aufgerufen falls diese Information etwas hilft. Er dient als Schnittstelle, damit das lokale Programm die Verbindungsdaten nicht preisgibt, da .NET Programme ja so einfach auslesbar sind
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Ja, das solltest du. Du solltest sicher gehen, dass du Stateless läufst. Du hast sonst das Problem, dass dir der Speicher zuläuft, wenn Disconnect nicht aufgerufen wird.
    Biete entsprechende Methoden an, die immer einen definierten Zustand zurücklassen.
    Du scheinst aber grad erst anzufangen mit dem Projekt oder? Dann würde ich dir empfehlen über einen WCF Service die Dienste zur Verfügung zu stellen und nicht mit einem "alten" WebService
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Hi Nico,

    vielen Dank für deine Antwort, das ergibt auf jeden Fall Sinn!
    Ich werde mir die WCF-Service Geschichte auf jeden Fall in den nächsten Tagen ganz genau ansehen!

    Denkst du denn das es generell der richtige Weg ist um eine Verbindung zur Datenbank zur Verfügung zu stellen? Es sollen max. 500 Clients die Möglichkeit haben auf einmal auf die DB zuzugreifen, jeder alle paar Sekunden, hast du eine Idee wie das bezüglich der Performance aussieht?

    Danke nochmal und schöne Grüße,
    Jonathan

    /Editiert:
    Hallo nochmal, also ich habe einige kurze Tests mit einem WCF-Service gemacht, bei denen ist es ja theoretisch möglich die Verbindung offen zu lassen.
    Ich vermute aber mal das es sich hier genauso verhält, dass es sicherer ist für jeden Zugriff eine neue Verbindung herzustellen?

    (Ich habe etwas weiter getestet und es scheint von der Performance her auch nicht unbedingt nötig zu sein ! )

    Schönen Gruß,
    Jonathan
    Geändert von Operator_Jon (08.09.09 um 23:15 Uhr)
     

  4. #4
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Ob es der Performance zuträglich ist bei 500 Clients hängt von der Architektur des Services ab. Es ist definitiv jedoch von Nachteil, wenn du Sessions cachen musst.
    Der Ansatz einen Service zur Verfügung zustellen ist auf jeden Fall der Richtige. Das ist das Prinzip von Client-Server-Anwendungen. Der Server stellt Dienste zur Verfügung.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  5. #5
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Hi Nico,

    was meinst du mit der Architektur?
    Also ich stelle es mir zurzeit so vor:
    Der Benutzer startet das Programm, es erstellt eine Instanz des Services beim Start:
    (Also das ganze natürlich nur als Beispiel)
    Code :
    1
    
    client = New ServiceReference1.Service1Client
    Dann verifiziert sich der Client und ruft einige Daten ab, die Daten kann er nach einmaliger Verifizierung immer wieder abrufen und auf neue Daten prüfen:
    Code :
    1
    2
    
    client.Verify(...)
    client.getMessages()
    Der Service ist folgendermaßen aufgebaut:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    Public Class Service1
        Implements IService1
     
        Private myConnection As MySqlConnection
        Private myDataAdapter As MySqlDataAdapter
        Private myDataSet As DataSet
     
        Private strSQL As String
        Private iRecordCount As Integer
     
        Public VERIFIED As Boolean
     
        Public Sub New()
            VERIFIED = False
        End Sub
     
        Private Sub Connect()
            myConnection = New MySqlConnection("server=xxx;user id=xxx;password=xxx;database=xxx;pooling=false;")
            myConnection.Open()
        End Sub
     
        Private Sub Disconnect()
            myConnection.Close()
        End Sub
     
        Public Function Verify(...) As String Implements IService1.Verify
            Connect()
     
            '....
            'Prüfe die Datenbank ob Benutuzer autorisiert ist
            '...
            VERIFIED = True
     
            Disconnect()
        End Function
     
     
        Public Function getMessages() As String Implements IService1.getMessages
            If VERIFIED Then
                Connect()
     
                 '....
                 'Hole einige Daten aus der DB und gebe sie zurück
                 '...
     
                Disconnect()
            Else
                Return ""
            End If
        End Function
    End Class

    (Ich werde die MySQL Funktionen noch in eine eigene Klasse auslagern denke ich!)

    Nun meine Frage, ist es ein Problem, dass im Client nirgendwo
    Code :
    1
    
    client.Close()
    aufgerufen wird?

    Passiert es dann auch, dass der Speicher zuläuft?


    Vielen Dank,
    Jonathan

    PS: Die Funktionalität des Services ist mit den paar Funktionen schon beinahe erreicht, da kommt nicht mehr viel dazu!
     

  6. #6
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Implementier zusätzlich das Interface IDisposable. Im Dispose räumst du auf, für den Fall, dass die Connection nicht geschlossen wird. (siehe auch Interface der DbConnection und DbAdapter-Klassen)

    Die Frage mit dem Client.Close versteh ich nicht, die Methode gibts doch gar nicht

    Anstatt der Methode Verifiy wäre es noch besser, wenn du den die Information in den Konstruktor geben würdest.

    Dann sind aber zum Teil nur Feinheiten, im Groben scheint es so erstmal zu passen
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Hi Nico,

    vielen Dank für die Namen der Interfaces, ich wusste gar nicht, dass es die gibt !

    client.Close() wird automatisch zur Verfügung gestellt, also im Client Programm das den Service aufruft! (Ich habe den Service als Service-Referenz hinzugefügt!)

    Mit dem Konstruktor hast du recht, das werde ich auf jeden Fall so machen!!

    Danke schon mal soweit!
    Hast du vielleicht noch einige Anregungen was die Sicherheit anbetrifft?
    Ich habe mir überlegt alle Kommunikationsdaten zu verschlüsseln, also einfach alles zwischen Client und Service. Ich schreibe den Client selbst, das heißt es soll ohnehin niemand auf den Service zugreifen können, außer diesen Programmen (kann man das eigentlich auch irgendwie einrichten, dass nur diese an die Kunden verteilten Programme den Service nutzen können?). Ich mache mir bei der Verschlüsselung allerdings Sorgen, weil man das Client Programm ja ganz einfach mit einem Reflector auslesen kann. Das bedeutet doch, dass jede noch so tolle Verschlüsselungsmethode nichts wert ist weil sie nachvollzogen werden kann !

    Wenn du da noch einige Anregungen hättest, das wäre total super !
    (Ich brauche keinen Code oder ähnliches, mir reichen Stichworte, sonst lerne ich ja nichts dabei )

    Schöne Grüße,
    Jonathan
     

  8. #8
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Geht es dir rein um die Übertragung der Daten? Dann kannst du das Binding über Https machen:
    http://weblogs.asp.net/srkirkland/ar...for-https.aspx
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  9. #9
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Hi Nico,

    danke für den Link, das werde ich tun!
    Unter der Annahme, dass man das Client Programm mit einem Reflector auslesen kann, versuche ich gerade mir eine Authentifizierungsmethode einfallen zu lassen, so dass wirklich nur meine Programme auf den Service zugreifen können. Mir fällt aber leider nichts ein, alles scheitert daran, dass der Code ausgelesen werden kann .
    Hast du da eine Idee?

    Was wären denn sonst noch für Sicherheitsaspekte zu beachten? Ich meine z.B. DOS-Attacken, lassen die sich irgendwie unterbinden durch bestimmte Routinen?

    Danke für deine Hilfe,
    schöne Grüße,
    Jonathan
     

  10. #10
    Registriert seit
    Jul 2003
    Ort
    Gronau, Nordrhein-Westfalen, Germany, Germany
    Beiträge
    634
    Ich habe es jetzt so gelöst, dass ich zusätzlich eine Verschlüsselungsroutine in den Webservice eingelagert habe und der Mechanismus so nicht im Client Programm zu sehen ist!

    Gibt es denn eine Möglichkeit, den Webservice wirklich nur diesem spezifischen Programm zugänglich zu machen? Sie sozusagen untrennbar miteinander verbinden?

    Vielleicht einen MD5 Hash der fertigen .exe mitsenden und den im Webservice prüfen?
    (Was ja auch wieder an der Auslesbarkeit des Codes im Client Programm scheitert... Ich bin verzweifelt )
     

Ähnliche Themen

  1. Webservice
    Von Chefkoch333 im Forum Adobe Flex & AIR
    Antworten: 0
    Letzter Beitrag: 05.02.10, 15:48
  2. Webservice in C#
    Von Johannes7146 im Forum .NET Web und Kommunikation
    Antworten: 7
    Letzter Beitrag: 24.08.09, 15:15
  3. WebService
    Von Saban im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 16.06.08, 11:31
  4. Antworten: 5
    Letzter Beitrag: 13.03.08, 09:45
  5. PHP WebService?
    Von MichiStroi im Forum PHP
    Antworten: 1
    Letzter Beitrag: 27.12.04, 09:51