2013-03-13 3 views
8

Этот вопрос связан с Bug in the dynamic language runtime in combination with IIS 7.5ChannelFactory ошибка с динамическими аргументами

ChannelFactory висит, если я предоставить ему правильно набран динамический объект.

dynamic src = "MSFT"; 

var binding = new BasicHttpBinding(); 
var endpoint = new EndpointAddress("http://www.restfulwebservices.net/wcf/StockQuoteService.svc"); 
var channel = new ChannelFactory<IStockQuoteService>(binding, endpoint).CreateChannel(); 

// this will print just fine 
Console.WriteLine(channel.GetStockQuote(src as string)); 

// this will print just fine 
Console.WriteLine(new StockQuoteServiceClient().GetStockQuote(src)); 

// this will never print and the application will hang with no exceptions 
Console.WriteLine(channel.GetStockQuote(src)); 
  • Служба выше общественности, это не мое, и вы можете проверить этот код самостоятельно, если вы просто добавить ссылку на службу к конечной точке, представленной в коде;
  • StockQuoteServiceClient был создан с помощью пункта меню «Добавить служебную ссылку» и отлично выполняет динамические объекты;
  • Это волшебство не происходит, когда я запускаю приложение с F5 на Debug, все строки печатаются, и программа выходит правильно;
  • Если я запустил его, а затем приложил отладчик во время выполнения, я вижу, что он висел на вызове channel.GetStockQuote(src);
  • Если я оставлю это, программа съест всю мою память;
  • Это только зависает, когда я использую свой собственный ChannelFactory с динамическими объектами, как описано в комментариях.

Почему мой ChannelFactory зависает, когда он принимает динамические объекты в качестве параметров, когда созданный с помощью Add Service Reference работает нормально?

+0

Использование отражение также работает. var метод = channel.GetType(). GetMethod ("GetStockQuote"); var value = (StockQuote) method.Invoke (канал, новый объект [] {src}); – lstern

ответ

3

Когда вы используете динамическое ключевое слово, каждый код, связанный с динамической переменной, будет скомпилирован в режиме выполнения DLR. При вызове метода с использованием динамической переменной, фактический метод подписи неизвестен во время компиляции, а также тип метод возвращения и все, что связано с его создать что-то Эрик Липперт под названием "Dynamic Contagion":

«Как я указывал в прошлый раз , когда аргумент вызова является динамическим , то коэффициенты довольно хороши, что компилятор будет классифицировать результат вызова как динамический, а также размытие размытия. Фактически, когда вы используете практически любой оператор динамического выражения, результат имеет динамический тип, за некоторыми исключениями. («is», например, всегда возвращает a bool.) Вы можете «вылечить» выражение, чтобы предотвратить его распространение динамизм, отбрасывая его на объект или любой другой нединамический тип ; литье динамически объект является преобразование идентичности.»

WCF внутренностей использует множество интерфейсов и абстракций и есть known DLR limitation относительно абстракций и интерфейсов, где DLR не решить правильный тип. (Также смотрите на this SO discussion)

я смог правильно вызвать ChannelFactory с помощью отражения и разливочного параметр других типов (а также пытаемся вызвать службу, используя неправильный тип). проблема должна быть DLR связана.

Я не удалось отладить компиляцию DLR, но проблема может быть связана с «dyna mic contagion "и ошибка разрешения интерфейса. При «заражении» каждая часть вызова WCF может быть скомпилирована во время выполнения, и ошибка разрешения типа может создавать некоторые контуры контуров в некоторых случаях с углами, например, реализация переопределенного метода, которая вызывает базовый метод, и базовый класс был неправильно разрешен одному и тому же ребенку класс.

Некоторые внутренние элементы WCF выполняют дополнительные инструкции при подключении отладчика (Debugger.IsAttached), что обычно включает в себя утверждения, проверки и атрибуты. Дополнительные инструкции могут предоставить некоторую информацию, которая убивает «динамическую зараженность» и позволяет избежать фиктивного бесконечного цикла.