Ich habe einen WCF-Dienst, der einen LinqToSql DataContext verwendet, um einige Informationen aus einer Datenbank abzurufen. Der Rückgabetyp der Operation ist IEnumerable <DomainObject
>, und ich habe eine Helper-Methode, die von der Tabelle abgeleitete LINQ-Objekt zu einem WCF-Datenvertrag wie folgt konvertiert:
[OperationContract]
public IEnumerable<DomainObjectDTO> RetrieveDomainObjects()
{
var context = CreateDataContext();
return from domainObject in context.DomainObjects
select ConvertDomainObject(domainObject);
}
private DomainObjectDTO ConvertDomainObject(DomainObject obj)
{
// etc...
}
Dieser Code zeigt ein seltsames Verhalten, wenn ich eine ungültige Verbindungszeichenfolge an den DataContext übergebe. Da er nicht in der Lage ist, die richtige Datenbank zu finden, löst der obige Code vermutlich eine SqlException aus, wenn er die IEnumerable aufzählt <DomainObjectDTO
> wenn die Serialisierung stattfindet. Wenn ich diesen Code jedoch in meinem Debugger ausführe, sehe ich auf der Serverseite überhaupt keine Ausnahme der ersten Chance! Ich habe den Debugger auf der Registerkarte Ausnahmen angewiesen, bei allen ausgelösten CLR-Ausnahmen abzubrechen, und das tut er einfach nicht. Ich sehe auch nicht die charakteristische "First chance exception"-Meldung im Ausgabefenster.
Auf der Client-Seite erhalte ich eine CommunicationException mit einer Fehlermeldung in der Art von "The socket connection terminated unexpectedly". Keine der inneren Ausnahmen gibt einen Hinweis auf die zugrunde liegende Ursache des Problems.
Der einzige Weg, wie ich das herausfinden konnte, war, den LINQ-Code so umzuschreiben, dass der Abfrageausdruck innerhalb der OperationContract-Methode ausgewertet wird. Übrigens erhalte ich das gleiche Ergebnis, wenn es ein Berechtigungsproblem gibt, oder wenn ich den DataContext in eine using-Anweisung verpacke, also ist dies nicht nur auf SqlExceptions beschränkt.
Abgesehen davon, dass es nicht ratsam ist, den Rückgabetyp zu einem IEnumerable zu machen <T
> und nur die Abfrage irgendwo in den Tiefen des Serialisierers aufzählen, ist WCF unterdrücken oder irgendwie verhindern, dass Ausnahmen in diesem Fall ausgelöst werden? Und wenn ja, warum?