ChannelFactory-Fehler mit dynamischen Argumenten

8

Diese Frage bezieht sich auf Fehler in der dynamischen Sprachlaufzeit in Kombination mit IIS 7.5

ChannelFactory hängt, wenn ich es mit einem korrekt typisierten dynamischen Objekt versehe.

%Vor%
  • Der obige Dienst ist öffentlich, gehört mir nicht und Sie können diesen Code selbst testen, wenn Sie nur den Dienstverweis zu dem im Code bereitgestellten Endpunkt hinzufügen;
  • StockQuoteServiceClient wurde mit dem Menübefehl Add Service Reference erstellt und verwendet nur dynamische Objekte;
  • Dies passiert magisch nicht, wenn ich die Anwendung mit F5 auf Debug starte, alle Zeilen drucken und das Programm korrekt beendet;
  • Wenn ich es ausführe und den Debugger während der Ausführung angehängt habe, sehe ich, dass er beim Aufruf von channel.GetStockQuote(src) ;
  • hängt
  • Wenn ich es belasse, isst das Programm meine ganze Erinnerung;
  • Es hängt nur, wenn ich mein eigenes ChannelFactory mit dynamischen Objekten verwende, wie in den Kommentaren beschrieben.

Warum hängt mein ChannelFactory , wenn dynamische Objekte als Parameter verwendet werden, wenn der von Add Service Reference erstellte einwandfrei funktioniert?

    
Juliano 13.03.2013, 02:44
quelle

1 Antwort

3

Wenn Sie das dynamische Schlüsselwort verwenden, wird jeder Code, der sich auf die dynamische Variable bezieht, vom DLR zur Laufzeit kompiliert. Wenn Sie eine Methode aufrufen, die eine dynamische Variable verwendet, ist die tatsächliche Methodensignatur in der Kompilierungszeit unbekannt und auch der Rückgabetyp der Methode und alles, was damit in Verbindung steht. Eric Lippert heißt " Dynamische Ansteckung ":

  

"Wie ich letztes Mal darauf hingewiesen habe, wenn ein Argument eines Anrufs dynamisch ist   Dann sind die Chancen ziemlich gut, dass der Compiler das Ergebnis klassifizieren wird   des Anrufs ebenso dynamisch; der Makel breitet sich aus. In der Tat, wenn du   Verwenden Sie fast jeden Operator auf einem dynamischen Ausdruck, das Ergebnis ist   dynamischer Typ, mit einigen Ausnahmen. ("ist" zum Beispiel immer zurück   a bool.) Sie können einen Ausdruck "heilen", um zu verhindern, dass er sich ausbreitet   Dynamismus, indem man es auf Objekt oder auf etwas anderes Nicht-Dynamisches wirft   tippen Sie möchten; Das dynamische Umwandeln in ein Objekt ist eine Identitätskonvertierung. "

WCF Internals verwendet viele Schnittstellen und Abstraktionen und es gibt eine bekannte DLR-Begrenzung bezüglich Abstraktionen und Schnittstellen, bei denen DLR den richtigen Typ nicht auflöst. (Siehe auch diese SO-Diskussion )

Ich konnte die ChannelFactory mithilfe von Reflection korrekt aufrufen und den Parameter an andere Typen übergeben (und auch versuchen, den Service mit dem falschen Typ aufzurufen). Das Problem muss DLR sein.

Ich kann die DLR-Kompilierung nicht debuggen, aber das Problem kann mit der "dynamischen Ansteckung" und dem Fehler der Schnittstellenauflösung zusammenhängen. Mit "contagion" kann jeder Teil des WCF-Aufrufs zur Laufzeit kompiliert werden, und der Typ-Auflösungsfehler kann in einigen Fällen zu endles-Schleifen führen, wie eine überlagerte Methodenimplementierung, die die Basismethode aufruft und die Basisklasse falsch zum selben Kind aufgelöst wurde Klasse.

Einige WCF-Interna führen zusätzliche Anweisungen aus, wenn der Debugger angeschlossen ist ( Debugger.IsAttached ) dieses Extra besteht im Allgemeinen in Behauptungen, Überprüfungen und Zuschreibungen. Die zusätzlichen Anweisungen können einige Informationen liefern, die die "dynamische Ansteckung" beenden und die falsche Endlosschleife vermeiden.

    
lstern 22.05.2013, 01:58
quelle