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.
StockQuoteServiceClient
wurde mit dem Menübefehl Add Service Reference erstellt und verwendet nur dynamische Objekte; channel.GetStockQuote(src)
; 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?
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.
Tags und Links wcf .net c#-4.0 wcf-client channelfactory