У меня есть требование, в котором я должен использовать System.Object в качестве параметра в WCF. Поскольку это не сериализуемо, я получаю сообщение, поскольку операция не поддерживается, так как использует System.Object. Любое решение этой проблемы.WCF System.Object Сериализация
1
A
ответ
5
При отправке сообщений по проводу WCF по умолчанию будет сериализовать только то, что достаточно, чтобы получить сообщение, то есть члены контрактов. Если ваше сообщение принимает «объект» в качестве параметра, дополнительную информацию необходимо отправить по проводу с информацией о типе. Если вы используете те же сборки на клиенте и на сервере, вы можете использовать NetDataContractSerializer (вместо DataContractSerializer) по умолчанию на сервере (и клиенте), и они смогут обменивать произвольные объекты, как показано в код ниже. Но, как уже упоминалось @MarcGravell, это не может быть лучшим использование WCF ...
Код для того, чтобы NetDataContractSerializer
:
public class Post_8b2c7ad7_b1c3_410b_b907_f25cee637110
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return string.Format("Person[Name={0},Age={1}]", Name, Age);
}
}
[ServiceContract]
public interface ITest
{
[OperationContract]
object Echo(object obj);
}
public class Service : ITest
{
public object Echo(object obj)
{
return obj;
}
}
public class ReplaceSerializerOperationBehavior : DataContractSerializerOperationBehavior
{
public ReplaceSerializerOperationBehavior(OperationDescription operation)
: base(operation)
{
}
public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
{
return new NetDataContractSerializer(name, ns);
}
public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
{
return new NetDataContractSerializer(name, ns);
}
public static void ReplaceSerializer(ServiceEndpoint endpoint)
{
foreach (var operation in endpoint.Contract.Operations)
{
for (int i = 0; i < operation.Behaviors.Count; i++)
{
if (operation.Behaviors[i] is DataContractSerializerOperationBehavior)
{
operation.Behaviors[i] = new ReplaceSerializerOperationBehavior(operation);
break;
}
}
}
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
var endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
ReplaceSerializerOperationBehavior.ReplaceSerializer(endpoint);
host.Open();
Console.WriteLine("Host opened");
ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
ReplaceSerializerOperationBehavior.ReplaceSerializer(factory.Endpoint);
ITest proxy = factory.CreateChannel();
Console.WriteLine(proxy.Echo("Hello"));
Console.WriteLine(proxy.Echo(123.456));
Console.WriteLine(proxy.Echo(new Uri("http://tempuri.org")));
Console.WriteLine(proxy.Echo(new Person { Name = "John Doe", Age = 33 }));
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
Смежные вопросы
- 1. Сериализация wcf
- 2. WCF сериализация
- 3. WCF Известный тип из System.Object в Config
- 4. WCF-сериализация методных тел
- 5. Чтение WCF JSON Сериализация
- 6. WCF DataMember Сериализация вопросов
- 7. WCF Изображение Сериализация
- 8. WCF простой сериализация
- 9. WCF Сериализация POCOs
- 10. Сериализация исключений из WCF
- 11. Условный WCF DataContract Сериализация
- 12. MVCContrib CustomPagination WCF Сериализация
- 13. Сериализация WCF и кэширование
- 14. Сериализация исключений WCF + Silverlight
- 15. WCF MessageContract Список Сериализация
- 16. WCF IList Сериализация Выпуск
- 17. WCF Сериализация Тип несоответствия
- 18. Сериализация предикатов по wcf
- 19. WCF Сериализация и интерфейсы
- 20. WCF: Сериализация? Streaming?
- 21. protobuf-net Сериализация System.Object With DynamicType Throws Exception
- 22. Как бросить System.Object [*] для System.Object []
- 23. Сериализация объектов linq с WCF
- 24. WCF Проблема Сериализация заголовок сообщения
- 25. WCF возможно сериализация проблема, связанная
- 26. WCF Сериализация с наложением объекта?
- 27. WCF Двунаправленная сериализация не удалась
- 28. Сериализация EntitySet - WCF, C#, VS2008
- 29. WCF DataMember DateTime Сериализация формата
- 30. WCF, инъекция зависимостей и сериализация
Что является причиной того, что делает вы хотите отправить 'object' (который полностью не требует контрактов) по договорно-ориентированному протоколу? Также (и я ненавижу себя за то, что даже упоминаю об этом) - попробовали ли вы включить NetDataContractSerializer через конфигурацию? –
Если объект не будет сериализовать что-либо, что вы ожидаете получить на другой стороне? –