[WCF][gelöst] Servicereference, AsyncCompletedEventArgs & Benennung der results...



  • Ich habe einen WCF-Service den ich mittels "Add Service Reference" hinzufüge, inklusive der Generierung von Asynchronen Schnittstellen. An sich auch kein Problem, nur ist mir noch nicht klar wie die Benennung der erzeugten Klassen (Konkret die Bennenung der results in den von AsyncCompletedEventArgs abgeleiteten Klassen erzeugt).

    Ich verwende derzeit vereinfacht MessageContracts als Rückantwort:

    [ServiceContract/*...*/]
    public interface IFooService
    {
      [OperationContract]
      GetFoolisteResult GetFooliste(
        GetFoolisteParameter parameter);
    }
    
    [MessageContract]
    public class GetFoolisteResult
    {
      [MessageBodyMember]
      public bool FooStatus;
    
      [MessageBodyMember]
      public IList<Foo> FooList;
    }
    
    //...
    

    Nun generiert VS daraus eine Klasse wie in Etwa:

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class GetFoolisteCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
    
      private object[] results;
    
      public GetAktionAnzeigelisteCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState)
      : base(exception, cancelled, userState) {
          this.results = results;
      }
    
      // Manche Eigenschaften werden so benannt wie im MessageContract...
      public bool FooStatus {
        get {
          base.RaiseExceptionIfNecessary();
          return ((bool)(this.results[0]));
        }
      }
    
      // ...aber eine wird immer mit Result benannt...
      // Die Regel welche ist mir aber noch verborgen.
      public System.Collections.ObjectModel.ObservableCollection<Foo> Result {
        get {
          base.RaiseExceptionIfNecessary();
          return ((System.Collections.ObjectModel.ObservableCollection<Foo>)(this.results[1]));
        }
      }
    }
    

    Mein Problem ist einfach: Nach welchen Regeln erfolgt die Benennung, und kann man diese ggf. irgendwie beeinflussen. Laut den Rückgaben ist es immer das letzte Element in results, aber wie die Reihenfolge wiederum erfolgt ist mir schleierhaft (sie entspricht nicht der Anordnung in der entsprechenden Klasse).

    Nachtrag:
    Nachdem ich gedacht hatte, die Lösung über "[MessageBodyMember(Order = ...)]" gefunden zu haben, ist die Lösung wohl in meinen Fall "Allways generate message contracts" zu verwenden (Die Order hat jedenfalls keine Auswirkungen an dieser Stelle).


Anmelden zum Antworten