using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Channels; using System.Runtime.Serialization; using System.ServiceModel.Description; namespace WCFPractice { [DataContract] public class ServiceData : IExtensibleDataObject { [DataMember(Name = "Info")] private string info; public string Info { get { return info; } set { info = value; } } private ExtensionDataObject extensionData; public ExtensionDataObject ExtensionData { get { return extensionData; } set { extensionData = value; } } } [DataContract] public class ClientData : IExtensibleDataObject { [DataMember(Name = "Info")] private string info; public string Info { get { return info; } set { info = value; } } private ExtensionDataObject extensionData; public ExtensionDataObject ExtensionData { get { return extensionData; } set { extensionData = value; } } public string extraInfo; } [ServiceContract(Name = "GO")] public interface IService { [OperationContract(Name = "DispInfo")] void MakeSense(string info); [OperationContract(Name = "DispEntity")] void MakeSense(ServiceData serviceData); } public class ServiceImplementation : IService { public void MakeSense(string info) { Console.WriteLine(info); } public void MakeSense(ServiceData serviceData) { Console.WriteLine("Info=" + serviceData.Info + " Extra Data=" + serviceData.ExtensionData); } } //Name = "GO"必须与服务端设置的值一样,这样做是为了能找到该服务 [ServiceContract(Name = "GO")] public interface IClient { [OperationContract(Name = "DispInfo")] void MakeSense(string info); //客户端序列化方法将参数的名称作为节点名。导致服务端反序列化时找不到相应的节点。 [OperationContract(Name = "DispEntity")] void MakeSense(ClientData serviceData);//该参数必须与服务端参数名字相同,这样服务端才能那序列化,否则会导致服务端接收不到客户端数据 } class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(ServiceImplementation), new Uri("http://localhost:8080"));//Uri随便定义 host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "Make");//Make随便定义 host.Open(); ChannelFactory<IClient> factory = new ChannelFactory<IClient>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8080/Make"));//将以上两个地址组合即可 IClient proxy = factory.CreateChannel(); proxy.MakeSense("Let's Go"); ClientData clientData = new ClientData(); clientData.Info = "I am Info"; clientData.extraInfo = "I am extra info"; proxy.MakeSense(clientData); ((IChannel)proxy).Close(); host.Close(); Console.ReadKey(); } } }