Laden...

Architektur: Webservice entwerfen

Erstellt von LastGentleman vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.417 Views
LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren
Architektur: Webservice entwerfen

Hallo zusammen,

jetzt heißt es für mich Werbedienste entwerfen.
Es soll ein Bestellsystem werden, nur stehe ich gerade auf dem Schlauch.

Ich möchte folgende Funktionen implementieren,

  1. Anmeldung, wer bin ich
  2. Bestellung Haupteigenschaften (Datum, meine Bestellnummer, Lieferanschrift, ...)
  3. Positionen zur Bestellung hinzufügen

Wird nun die ganze Bestellung in ein Objekt gepackt oder mache ich im meinem Webservice mehrer Funktionen.

Vielen Dank für eure Mühe im Voraus
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
130 Beiträge seit 2007
vor 16 Jahren

Original von LastGentleman
Hallo zusammen,
[...]
Ich möchte folgende Funktionen implementieren,

  1. Anmeldung, wer bin ich

Mit Session-Mangement?

  1. Bestellung Haupteigenschaften (Datum, meine Bestellnummer, Lieferanschrift, ...)

Erstell auf dem WebService eine "Bestellung" Fachklasse z.B. Order und pack dort alle relevanten Attribute rein. Der WS Consumer kann dann ebenfalls auf die Fachklasse zugreifen.

  1. Positionen zur Bestellung hinzufügen

Quasi ein Update auf vorhandene Bestellungen?

moq

3.728 Beiträge seit 2005
vor 16 Jahren
Dokument-orientiert denken

Webdienste sind statuslos. Das bedeutet, dass sie (sehen wir vom Sitzungsstatus mal ab) zwischen zwei Methodenaufrufen alles vergessen. In kleinen Häppchen zu arbeiten ist also fehl am Platz.

Also ++**nicht **++so:


public Interface IOrderWebService
{
    int CreateOrder(Customer customer, string customersDocumentNo);

    int InsertItem(int orderID,OrderItem item);
}

Sondern so:


public Interface IOrderWebService
{
    int CreateOrder(OrderDocument order);
}

Statt vieler kleiner Funktionen mit vielen Paramatern, eine dicke Funktion mit einem Dokument als Paramater. Als Dokumente eignen sich Objekte oder DataSets, die mit XML-Attributen versehen sind und einem XML-Schema genügen. Das OrderDocument würde also die kopfdaten und sämtliche Positionen der Bestellung beinhalten. Die CreateOrder-Funktion würde das eigende OrderDocument prüfen (validieren) und wenn alles ok ist, alles innerhalb einer Transaktion verbuchen.

Der Client des Webdienstes bereitet ein komplettes Dokument fix und fertig vor und schickt es dann zum verbuchen an den Webdienst. Bei häppchenweiser Verarbeitung hast Du auch Probleme alles in eine Transaktion zu fassen.

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Danke moq

Erstell auf dem WebService eine "Bestellung" Fachklasse z.B. Order und pack dort alle relevanten Attribute rein. Der WS Consumer kann dann ebenfalls auf die Fachklasse zugreifen.

Quasi ein Update auf vorhandene Bestellungen?

Technisch gesehen würde das so aussehen, es gibt eine Login Klasse, wo ASP.Net in den Session Variablen das Passwort und den Benutzernamen hält.
Falls dies nicht gegeben ist, dann erzeugt eine Exception.

Mein Webdienst liefert mir beim Bestellung erstellen eine Liste von Detailpositionen zurück die ich wieder um lokal verändern und Zeilen anfügen kann und mittels einer Update-Funktion wieder in meine DB speichern.

Ich hoffe ich hab es richtig verstanden?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Hallo Rainbird,

danke auch für deinen Beitrag, deine Variante gefällt mir besser weil sie mehr dem SOA Prinzip entspricht.

Kurze Frage am rande würdet ihr die Benuzerdate auch in das Dokument packen?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

3.728 Beiträge seit 2005
vor 16 Jahren
Arbeitsauftrag

Ich würde auch die Identität des Benutzers ins Dokuemnt packen. Schließlich ist das Dokument als kompletter Arbeitsauftrag für den Dienst anzusehen.

Die Identität sollte aber gegen die technische Identität des Aufrufers (Credentials) gegen geprüft werden. Damit Bob nicht im Namen von Alice eine Bestellung einbuchen kann (es sei denn das Sicherheitssystem implement eine Vertreterregelung 😉).

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Die Identität sollte aber gegen die technische Identität des Aufrufers (Credentials) gegen geprüft werden. Damit Bob nicht im Namen von Alice eine Bestellung einbuchen kann (es sei denn das Sicherheitssystem implement eine Vertreterregelung 😉).

Das bedeutet also das die man separat noch dazu die Credentials des Service aufrufers prüfen sollte?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
130 Beiträge seit 2007
vor 16 Jahren

Ich würde mir ein eigenes Session-Mangement erstellen und wie Rainbird es angedeutet hat jeglich auf Methoden mit "großen" Parametern setzen.

Je nachdem was du noch für Funktionen implementieren möchtest/musst wäre es so leichter Benutzerbezogene Aufgaben zu erledigen. (Bsp. Passwort ändern / ...).

Der Nachteil dabei wäre allerdings das sich der Code teilweise künstlich aufbläht und jede Methode einen zusätzlichen Parameter bekommt. (-> eindeutige Nummer anhand die Consumer unterscheidbar sind).


    [WebMethod]
    public int Login(string username, string pwSHA1, string guid)
    {
            if(....)
            {
               SessionData data = new SessionData();
               data.Username = username;
               data.ExpirationDate = DateTime.Now.AddMinutes(30).ToLongTimeString();
               data.XYZ = value;
               data.IsLoggedIn = true;
               SaveSession(guid, data);
               return 0;
           }
           
          return -1;            
     }

    [WebMethod]
    public string GetUserName(string guid)
    {
        SessionData data = FindSession(guid);
        return data.Username;
    }

    [WebMethod]
    public int CreateOrder(OrderDocument order, string guid)
    {
        SessionData data = FindSession(guid);
        (....)
    }

Was sagt Herr Rainbird zu der o.g. Methodik?

3.728 Beiträge seit 2005
vor 16 Jahren
Standard

Original von moq
Was sagt Herr Rainbird zu der o.g. Methodik?

Das funktioniert bestimmt gut.

Ich verwende allerdings lieber die eingebauten Sitzungs- und Authentifizierungswerkzeuge. Der Basisklasse Webservice stellt beides über die Eigenschaften User und Session zur Verfügung.

Natürlich passen die fertigen Sachen nicht immer optimal. Deshalb kann eine eigene Sitzungsverwaltung eine Alternative sein. Ich würde aber erst eine eigene Sitzungsverwaltung implementieren, nachdem ich die Standard-Tools auf Herz und Nieren geprüft und für unpassend befunden hätte. Erfahrungsgemäß fährt man mit den eingebauten Features nicht schlecht.