WCF System.Object Serialization
I have a requirement in which i have to use System.Object as a parameter in WCF. As it is not serializable,I am getting the message as the operation is not supported as it uses System.Object. Any solution to this problem.
When sending messages over the wire, WCF by default will only serialize what's enough to get the message across, ie, the members of the contracts. If your message takes an "object" as a parameter, extra information needs to be sent over the wire with the type information. If you use the same assemblies on the client and the server, you can use the NetDataContractSerializer (instead of the default DataContractSerializer) in the server (and the client), and they'll be able to exchange arbitrary objects, as shown in the code below. But, as @MarcGravell mentioned, this may not be the best usage of WCF...
The code to enable the 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();
}
}
链接地址: http://www.djcxy.com/p/93554.html
上一篇: 在WCF中序列化IDictionary <string,object>
下一篇: WCF System.Object序列化