Служба WCF создает исключение для некоторых типов - PullRequest
2 голосов
/ 11 мая 2011

Я создал службу WCF. В моем контракте на данные у меня есть два атрибута, скажем:

[DataMember]
Private User objUser;

и

[DataMember]
Private tempClass ObjTemp;

У меня есть свойство get и set для обоих атрибутов.В моем классе реализации у меня есть объект класса datacontract ... скажем так.objData.

Когда я назначаю

objData.ObjTemp=(function which return objTemp);

, сервис работает нормально.Но при назначении.

objData.objUser=(function which return objUser)

выдается следующее сообщение об ошибке:

Основное соединение было закрыто: соединение было неожиданно закрыто.

Когда я комментирую

objData.objUser=(function which return objUser)

, он снова работает нормально.

Когда я проверяю код в своем классе User, я обнаружил одну проблему, создающую свойство.Когда я меняю свойство, оно тоже работает нормально;но я не знаю, почему это свойство создает проблему.

Свойство выглядит следующим образом:

public IPAddress IP { get; set; }

Теперь этот класс IPAdress содержит конструктор и получает и устанавливает переменную ip.В get он просто возвращает переменную ip.

в наборе проверяет некоторое условие и затем присваивает значение переменной ip.Если условие не выполнено, возникает исключение.Кто-нибудь может объяснить, в чем может быть проблема?

Я только что проверил другую вещь.

Если я удаляю атрибут [DataMember] из private User objUser;, он работает нормально;но если я положу [DataMember] обратно, он генерирует ту же ошибку.

есть предложения?

1 Ответ

1 голос
/ 11 мая 2011

Скорее всего, вы обнаружите, что objUser не сериализуем. Для получения дополнительной информации прочитайте это: MSDN: Использование контрактов данных

Процитирую короткий фрагмент этого:

Все примитивные типы .NET Framework, такие как целые числа и строки, а также некоторые типы, рассматриваемые как примитивы, такие как DateTime и XmlElement, могут быть сериализованы без какой-либо другой подготовки и считаются имеющими контракты данных по умолчанию. ... Новые сложные типы, которые вы создаете, должны иметь контракт данных, определенный для их сериализации.

Вы также можете использовать Service Trace Viewer от Microsoft, чтобы помочь отследить точную проблему, с которой вы столкнулись.


Edit:

если это объект System.Net.IPAddress, о котором вы говорите, то он помечается как [Serializable], но у него нет конструктора по умолчанию без параметров , что является одним из требований необходимо при использовании DataContractSerializer (именно это используется для сериализации ваших объектов данных через границу WCF). Вы также можете убедиться, что если какой-либо из ваших пользовательских объектов, используемых в ваших вызовах WCF, содержит какие-либо дополнительные пользовательские объекты (в свойствах, например, ваш IP-адрес), то они будут украшены атрибутом KnownType .

Таким образом, в качестве решения вы можете написать свой собственный класс IPAddress, который хорошо работает с DataContractSerializer, или переключиться на использование XmlSerializer в вызовах WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...