Laden...

WCF: Client, Channel, Handling

Erstellt von RaphaelH vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.016 Views
R
RaphaelH Themenstarter:in
65 Beiträge seit 2011
vor 12 Jahren
WCF: Client, Channel, Handling

Hallo zusammen 😃

Ich möchte einen WinForm Client erstellen dieser besitzt:

LoginForm, MenuForm, und weitere Unterformen welche in der MenuForm auswählbar sind..

Dazu habe ich eine Channel Klasse erstellt, diese verwaltet die Verbindung und Aufruf aller Methoden des WCF-Service, hier ein kleines Beispiel:


namespace Client
{
   public delegate void LoginSuccessEventHandler();
   public delegate void ErrorEventHandler(Exception ex);

   public class Channel : Contract.IContractCallback
   {
      private Contract.ContractClient _channel;
      private string _userName;
      private string _password;
      public event LoginSuccessEventHandler OnLoggedIn;
      public event ErrorEventHandler OnError;
      protected virtual void LoggedIn()
      {
         LoginSuccessEventHandler onLoggedIn = OnLoggedIn;
         if (onLoggedIn != null)
            onLoggedIn();
      }
      protected virtual void Error(Exception ex)
      {
         ErrorEventHandler onError = OnError;
         if (onError != null)
            onError(ex);
      }
      public void Authenticate(string userName, string password)
      {
         if (UserName.Length <= 0)
            throw new Exception("Bitte geben Sie einen Benutzernamen ein");
         if (Password.Length <= 0)
            throw new Exception("Bitte geben Sie ein Passwort ein");
         _userName = userName;
         _password = password;
         Connect();
      }
      private void Connect()
      {
         try
         {
            _client = new Contract.ContractClient(new InstanceContext(this));
            _client.ClientCredentials.UserName.UserName = _UserName;
            _client.ClientCredentials.UserName.Password = _Password;
            _client.ClientCredentials.ServiceCertificate. Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
            _client.Open();
            LoggedIn();
         }
         catch (Exception ex)
         {
            Error(ex);  
         }
      }
   }
}

Hier kommt die erste Frage, wäre es so richtig? Bzw. ist dies schön? Denn so werden etliche delegates, events, voids entstehen je mehr Funktionen mein WCF-Service hat.. Denn für jede Funktion mit Rückgabe wert brauche ich ein Event.

Ich habe gedacht, da ich viele Forms habe, könnte ich eine art FormHandler-Klasse erstellen.

Dann kommt die nächste Frage, soll dieser FormHandler diese Channel Klasse verwalten? Also der FormHandler registriert die Events und gibt gegebenenfalls die Werte an die Forms weiter, oder soll der FormHandler den Forms die Channel Instanz bei der initialisierung weitergeben und diese registriere selbst die Events?

Dazu kommt wie genau könnte man so einen FormHandler erstellen, soll dieser bei jeder neuen Form das Closing Event abfangen und dann diese Form nur Verstecken und z.b. zurück zur vorherigen Form gehen (Menu / Login)?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo RaphaelH,

ich würds anders machen. Schau dir mal WCF: Basisklasse für einen Proxy an, danach kannst du dich orientieren. D.h. in der Form übergibst du den Proxy und ruft auf diesen die Methoden des Service auf.

Für die Authetifizierung kannst du dir auch mal Client Application Services anschauen.

Für die weiteren Fragen beachte bitte [Hinweis] Wie poste ich richtig? Punkt 1.2, daher nur kurz: wenn du Logik von Darstellung trennst (z.B. durch Verwendung von MVC od. MVP) dann ergibt sich das von alleine.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

R
RaphaelH Themenstarter:in
65 Beiträge seit 2011
vor 12 Jahren
  • Ich brauch keine Basisklasse für einen Proxy diesen erstellt mir Visual Studio automatisch.

  • Authentifizierung an sich funktioniert ja.

  • Es geht mir mehr ums Design.. MVP schön und gut.. Jedoch mit meiner Channel Klasse, erstelle ich ja viele Events, muss man dies? Oder könnte man das auch anders umgehen dynamisch machen oder sonst was?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo RaphaelH,

Ich brauch keine Basisklasse für einen Proxy diesen erstellt mir Visual Studio automatisch.

Wozu erzeugst du dann die Channel-Klasse, die ist ja wiederum quasi ein Proxy für den Proxy von VS?
Wenn du gleich den Proxy selbst machst, hast du eine Klasse.

Denn für jede Funktion mit Rückgabe wert brauche ich ein Event.
...
Jedoch mit meiner Channel Klasse, erstelle ich ja viele Events, muss man dies?

Nein muss man nicht. Eine Methode kann ja das Ergebnis direkt mit return zurückgeben. So machst du das verkomplizierter.
BTW: für jedes Event braucht nicht ein Delegate deklariert werden, denn dafür gibts den EventHandler- und EventHandler<T>-Delegaten. Siehe auch [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse).

Und wie oben gesagt: ich würds anders machen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

R
RaphaelH Themenstarter:in
65 Beiträge seit 2011
vor 12 Jahren

Dazu sollte ich vielleicht sagen, dass einige Funktionen des WCF-Services einige Sekunden brauchen bis sie antworten, daher wollte ich auf Funktionen mit Return wert verzichten, da hier die GUI einfrieren würde. Also einfach in nem Thread die Funktion aufrufen und das Event registrieren und dann wenn Daten empfangen, verarbeiten.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo RaphaelH,

dass einige Funktionen des WCF-Services einige Sekunden brauchen bis sie antworten,

Daher gibts auch asyncrhone Vorgänge die in der WCF beim Server, Client od. beiden umgesetzt werden können.

Das geht auch wenn du den Proxy generieren lässt, indem dort im Dialog die Checkbox dafür angehakt wird. Dabei wird das ereignisbasierte asynchrone Muster umgesetzt.

Wenn du .net 4.0 verwendest kann das auch super mit Task<TResult> gelöst werden und für die UI dann per Continuation mit dem TaskScheduler.FromCurrentSynchronisationContext. Für die Tasks gibts im Snippet auch etwas dafür.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"