Отражение и WCF - PullRequest
       16

Отражение и WCF

3 голосов
/ 01 марта 2011

Я вызываю метод WCF с использованием метода InvokeMember. Метод WCF принимает целое число и объект out в качестве параметра. это код службы 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.

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

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Что делает конструктор MyClass?Есть ли у MyClass какой-то случайный статический конструктор?

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

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

0 голосов
/ 01 марта 2011

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

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

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

...