WCF с общими объектами и полученными классами на клиенте
-
28-09-2019 - |
Вопрос
У меня есть служба WCF, и я использую типы с клиентом в общей сборке. Если клиент создает производный класс, можно будет передать полученный тип на службу, чтобы я мог прочитать дополнительные свойства через отражение?
Я попробовал, но имея проблемы с известными тепами, поскольку служба не знает, как десертифицировать полученный тип.
[Serializable]
public abstract class Car : ICar
{........
// на клиенте:
[Serializable]
public class MyCar : Car
{......
При прохождении MyCar на сервис, я получаю исключение, жалующееся на известность keytype, но я не могу добавить это на сервер, так как я не знаю, что клиент будет отправляться, и я хочу обрабатывать дополнительные свойства посредством отражения.
Можно зарегистрировать типы клиентов как известных пьесовPES во время выполнения?
Это может быть решение?http://blogs.msdn.com/b/sowmy/archive/2006/03/26/561188.aspx.
Решение
Это невозможно. Оба сервиса, так и клиента должны знать, какие типы будут отправлены в сообщения. Если вы хотите использовать известный тип, вы должны определить это отношение к родительскому типу на службе.
Почему вам нужно знать добавленные свойства на сервере?
Другие советы
Я думаю, что есть путь.
Я смутно помню, что когда я изучал WCF, я встретил ExtensionData, который должен быть механизмом, чтобы получить все, что не соответствует сериализации класса. Например, если вы включите ExtensionData, и вы находитесь в этой ситуации
//Server
public class GenericRQ
{
public string GenericProperty {get;set;}
}
public Service GenericService
{
Public void GenericMethod(GenericRQ RQ)
{
}
}
// client
Public class MoreSpecificRQ : GenericRQ
{
public string SpecificProperty {get;set;}
}
В
Public void GenericMethod(GenericRQ RQ)
{
// the serializer adds automatically in RQ.ExtensionData everything that has come and that does not match the class GenericRQ.
}
О том, как включить ExtensionData, вы можете легко найти в Интернете