添加引用 System.Runtime.Serialization
我们在做wcf开发时,经常用到复杂类作为参数的情况,也就是我们要用到的数据协定
服务端定义服务协定
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace wcf
{
[ServiceContract(Namespace = "demo", Name = "demo")]
interface IDemo
{
[OperationContract]
int add(int a, int b);
void run();
[OperationContract]
void test(test tt);
}
}
实现类
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace wcf
{
class Demo:IDemo
{
public int add(int a, int b)
{
return a + b;
}
public void run()
{
}
public void test(test tt)
{
Console.WriteLine(tt.age.ToString());
}
}
}
数据协定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace wcf
{
[DataContract(Name = "test", Namespace = "test")]
class test
{
//[DataMember(Order =2)]
//忽略此属性
[IgnoreDataMember]
public int age { get; set; }
[DataMember(Order =1)]
public string name { get; set; }
}
}
program 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace wcf
{
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:500");
using (ServiceHost serviceHost = new ServiceHost(typeof(Demo), uri))
{
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
serviceHost.AddServiceEndpoint(typeof(IDemo), basicHttpBinding, "demo");
serviceHost.Open();
Console.Read();
}
}
}
}
客户端 服务协定
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace client
{
[ServiceContract(Namespace ="demo",Name ="demo")]
interface Itest:IClientChannel
{
[OperationContract]
int add(int a, int b);
[OperationContract]
void test(test tt);
}
}
数据协定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace client
{
[DataContract(Name = "test", Namespace = "test")]
class test
{
//[DataMember]
[IgnoreDataMember]
public int age { get; set; }
[DataMember]
public string name { get; set; }
}
}
program类
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace client
{
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:500/demo");
EndpointAddress eaddr = new EndpointAddress(uri);
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
Itest itest = ChannelFactory<Itest>.CreateChannel(basicHttpBinding, eaddr);
int a = itest.add(3, 5);
itest.test(new test() { age = 10, name = "test" });
Console.WriteLine(a.ToString());
Console.ReadKey();
itest.Close();
}
}
}
对于一个类中,将另一个类作为属性的情况,需要添加KnowType特性
比如
namespace client
{
[DataContract(Name = "test", Namespace = "test")]
[KnownType(typeof(child))]
class test
{
//[DataMember]
[IgnoreDataMember]
public int age { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public child child { get; set; }
}
}
namespace client
{
[DataContract(Namespace = "child", Name = "child")]
public class child
{
[DataMember]
public string test { get; set; }
}
}