Autor Beitrag
Määx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Mo 25.02.13 12:48 
Hallo zusammen,

ich habe mich jetzt mit dem EntityFramework und SOAP seit einigen Tagen rumgeschlagen und komme einfach nicht weiter. Ich kann Daten aus der DB lesen, mit den zugehörigen Objekten arbeiten oder neue Objekte in die DB schreiben. Über einen SOAP-Service (gehostet im IIS) kann ich Dienste anbieten wie das zurückgeben einer zu einer Person gehörigen GruppenID. Der gleiche Service hat aber neben der Funktion getGruppenId auch die Methode getGruppe. Wenn ich mir zunächst die ID hole funktioniert es wunderbar, möchte ich dann jedoch noch das komplexe Objekt Gruppe haben (Klasse vom EntityFramework erstellt), bekomme ich im Client die folgende Fehlermeldung:
ausblenden Quelltext
1:
Fehler beim Empfangen der HTTP-Antwort für http://localhost:10668/ServiceGruppenRequest.svc. Die Ursache kann sein, dass die Dienstendpunktbindung kein HTTP-Protokoll verwendet. Eine andere mögliche Ursache ist, dass der HTTP-Anforderungskontext vom Server abgebrochen wird (vermutlich auf das Herunterfahren des Diensts zurückzuführen). Weitere Informationen finden Sie in den Serverprotokollen.					


Der Dienst läuft weiterhin im IIS Express und die Server-Log ist -für mich- auch nicht wirklich informativ:
ausblenden Quelltext
1:
2:
3:
4:
5:
#Software: Microsoft Internet Information Services 8.0
#Version: 1.0
#Date: 2013-02-25 10:27:44
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2013-02-25 10:27:44 ::1 GET /ServiceGruppenRequest.svc/$metadata - 10668 - ::1 Mozilla/4.0+(compatible;+MSIE+6.0;+MS+Web+Services+Client+Protocol+4.0.30319.18034) - 400 0 0 352


Ich denke, dass das irgendwie mit dem EntityFramework zusammenhängt und SOAP vll. einige Daten so nicht übertragen kann?
Die Gruppen-Klasse sieht gekürzt so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
namespace Database
{
    using System;
    using System.Collections.Generic;
    
    public partial class Gruppen_List
    {
        public int gruppenId { get; set; }
        public Nullable<int> gruppenleiterID{ get; set; }
        public string name { get; set; }
        //[...]
    
        public virtual Leiter_Stammdaten Leiter_Stammdaten { get; set; }
        //[...]
    }
}


Hat jemand eine Idee woran dies liegen könnte?

Vielen Dank für eure Hilfe
Määx
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Fr 01.03.13 13:53 
Hat keiner eine Idee?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 01.03.13 14:22 
Bei WCF ist es am ehesten ein Konfigurationproblem. Zum Beispiel sind die Anzahl der Elemente bzw. die Größe des Objects erstmal auf ein sinnvolles Maximum begrenzt wenn du einfach eine beliebig lange Liste von irgendwas überträgst wirst du mit Garantie in irgendein Quota tretten. Wenn es da zu Problemen kommt solltest du das WCF Logging mal einschalten und dir ansehen woran es da konkret scheitert.
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Fr 01.03.13 18:18 
Hey,

erstmal Danke für die Info. Ich habe inzwischen rausgefunden an welcher Stelle es liegt. Und zwar handelt es sich scheinbar um eine ICollection (sorry, das hatte ich bei der Fragestellung scheinbar übersehen).

Allerdings gibt es hier bereits auf der Serverseite einen Fehler wenn ich auf diese zugreifen will. Lade ich die Person aus der Datenbank, erstelle lokal eine zweite Person2 und möchte der Person2 die ICollection von Person zuordnen erhalte ich direkt folgenden Fehler:
"Die ObjectContext-Instanz wurde verworfen und kann nicht mehr für Vorgänge verwendet werden, für die eine Verbindung erforderlich ist"

Wie kann man das logging den aktivieren? Muss ich dies auf Server oder Clientseite machen?

Vielen Dank
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 01.03.13 18:24 
Zitat:
Wie kann man das logging den aktivieren? Muss ich dies auf Server oder Clientseite machen?


msdn.microsoft.com/e...ibrary/ms730064.aspx
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Mo 04.03.13 13:09 
Hey zusammen,

ich habe das Problem jetzt auf das EntittyFramework reduzieren können...
Es liegt nicht an der SOAP-Anbindung, sondern daran, dass die Referenzen irgendwie immer auf den Datenbank-Context gelegt sind, der in der SOAP-Message nicht mehr verfügbar ist.
Kopiere ich sämtliche Daten in ein Temporäres Objekt PersonTemp und erzeuge entsprechend auch neue "Unterobjekte" funktioniert das Ganze wunderbar.
Da ich jedoch so für jede meiner Objekte eine extra Funktion DeepCopy schreiben muss, empfinde ich es als recht kompliziert. Hinzu kommt, dass bei der Verwendung von MemberwiseClone() (die Unterobjekte überschreibe ich dann noch zusätzlich für die DeepCopy) ebenfalls ein Fehler auftritt. Ich muss also jeden Parameter aller Klassen manuell kopieren.

Gibt es da eine einfachere Methode das EntityFramework zu nutzen, die Objekte aber über SOAP zu versenden?

Vielen Dank für eure Hilfe
Määx
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 04.03.13 13:35 
Den Default ObjectContext kannst du nicht einfach über WCF transportieren. Der greift ja dynamisch auf die Datenbank dahinter zu wenn du per Lazy Loading abhängige Objekte über irgendeine Property beziehst. Das was du per SOAP überträgst sind nur Daten keine Logik.

Du könntest das LazyLoading ausschalten (in den ContextOptions gibt es eine LazyLoadingEnabled Property). Aber wenn du schon schreibst wie schwer es es ist eine saubere Deep Copy zu erstellen hab ich das Gefühl du versuchst zu viel in einem Webservice Aufruf zu transportieren. Wenn du eine saubere Lösung willst und keine einfache solltest du einen DataContract definieren der sich an dem Problem den du per Webservice darstellen willst orientiert unabhängig von der Struktur die du per EF persistiert und der nur das transportiert was auch wirklich notwendig ist.
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Mo 04.03.13 15:27 
ok, danke für die Rückmeldung. Hatte damit -glaube ich- bereits angefangen und es scheint sehr gut zu funktionieren.
Mein Ansatz:
Ich habe jetzt in dem Service-Interface diverse DataContracts mit DataMembern (reduziert auf die für die jeweilige Anfrage tatsächlich nötigen Daten). In meiner Service-Klasse habe ich nun Übersetzungsfunktionen eingebaut, die mir aus dem Entity-Objekt die benötigten Daten in ein Objekt aus dem DataContract übersetzen.

Ist das so korrekt?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 04.03.13 16:12 
Zitat:
Ist das so korrekt?


Ich würde es zumindest auch so machen.


Zuletzt bearbeitet von Ralf Jansen am Mo 04.03.13 16:26, insgesamt 1-mal bearbeitet
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Mo 04.03.13 16:24 
super, dann wieder einmal vieln Dank für deine schnelle & Kompetente hilfe !