Отражение и WCF

я вызываю метод WCF, используя метод InvokeMember. Метод WCF принимает целое число и объект вывода в качестве параметра. это код в службе WCF:

 public int SimpleTest(int n, out object OBJ)
    {
        OBJ = new Int32();
        OBJ = 12;
        return n;
    }

когда я использую InvokeMember для вызова функции с параметрами new Object[]{1 , obj} , obj становится равным 12, как и ожидалось.
но когда OBJ внутри SimpleTest устанавливается на сложный объект (OBJ = new MyClass()), я получаю следующее исключение на странице, вызвавшей метод: Exception has been thrown by the target of an invocation.
внутреннее исключение утверждает, что The underlying connection was closed: The connection was closed unexpectedly.

я не могу понять, почему это исключение произошло. кто-нибудь может объяснить?


person scatman    schedule 01.03.2011    source источник


Ответы (2)


Что делает конструктор MyClass? У MyClass случайно нет статического конструктора?

Exception has been thrown by the target of an invocation. может, например, быть вызвано исключением внутри статического конструктора для класса, поэтому кажется, что статический конструктор для MyClass пытается подключиться к чему-то (например, к базе данных), но не может, потому что соединение уже закрыто.

Помните, что статический конструктор запускается не при запуске программы, а до создания первого экземпляра MyClass.

person Øyvind Bråthen    schedule 01.03.2011
comment
Это также может быть обычный конструктор, а не только статический ctor; завернутое исключение связано только с InvokeMember - person Marc Gravell; 01.03.2011
comment
Как было задано моей первой строкой в ​​моем ответе :). Но я почти уверен, что здесь виноват один из конструкторов. - person Øyvind Bråthen; 01.03.2011

Настройка трассировки WCF на сервере точно покажет вам, что происходит не так.

Я думаю, вы обнаружите, что стек канала на стороне службы генерирует исключение, поскольку он пытается сериализовать параметр out в ответное сообщение для отправки обратно вашему клиенту. Это приводит к сбою канала на стороне службы, и исключением, которое вы видите на стороне клиента, является представление на стороне клиента последовательного разрыва соединения, инициированного службой.

Причина исключения при сериализации заключается в том, что ваш контракт данных сообщает средству форматирования операции ожидать ванильный object, но ваш метод выводит EntityObject. Если вы хотите поддерживать значения выходных параметров, отличные от основных простых типов, вам необходимо предоставить средству форматирования больше информации о конкретных типах, которые, возможно, необходимо сериализовать, либо с помощью KnownTypeAttribute, либо путем явного подключения кода в стеке канала службы.

person Chris Dickson    schedule 01.03.2011