创建Solution
1、WCFDataContract:一个类库项目,定义契约数据对象,引用System.Runtime.Serialization程序集。
using System.Runtime.Serialization;
namespace WCFDataContract
{
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public Contact Contact { get; set; }
}
}
2、WCFServiceContract:一个类库项目,定义契约,引用System.ServiceMode程序集。
using System.ServiceModel;
using WCFDataContract;
namespace WCFServiceContract
{
[ServiceContract]
public interface IPersonService
{
[OperationContract]
int GetPersonAge(string name);
[OperationContract]
Contact GetPersonContact(Person person);
}
}
3、WCFServiceLibrary:一个类库项目,实现契约。
也可以创建WCF Service Library项目,自动添加App.config,且编译参数多了/client:"WcfTestClient.exe"
using WCFServiceContract;
using WCFDataContract;
namespace WCFServiceLibrary
{
public class PersonService : IPersonService
{
public int GetPersonAge(string name)
{
return name.Length;
}
public WCFDataContract.Contact GetPersonContact(WCFDataContract.Person person)
{
Contact contact = new Contact();
contact.Address = person.Name + "'s Address";
contact.Mail = person.Name + "@mail.com";
return contact;
}
}
}
4、定义服务,有两种定义服务端的方式。
4.1、WCFWebAppService:一个Web Application项目,定义基于IIS的服务。需要引用前三个项目和System.ServiceMode程序集。
a、为WCF服务创建PersonService.svc文件
b、配置WCF服务Web.config文件。在configuration节点下添加:
<behaviors>
<serviceBehaviors>
<behavior name="WCFWebAppService.PersonServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="WCFWebAppService.PersonServiceBehavior"
name="WCFServiceLibrary.PersonService">
<endpoint address="" binding="wsHttpBinding" contract="WCFServiceContract.IPersonService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
4.2、WCFWinAppService:一个Console Application项目,定义自启动的服务。同样需要引用前三个项目和System.ServiceMode程序集。
using System.ServiceModel;
using WCFServiceLibrary;
using WCFServiceContract;
using System.ServiceModel.Description;
namespace WCFWinAppService
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(PersonService)))
{
host.AddServiceEndpoint(typeof(IPersonService), new WSHttpBinding(), "http://localhost:9999/personservice");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://localhost:9999/personservice/metadata");
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate { Console.WriteLine("PersonService已经启动,按Enter键终止服务!"); };
host.Open();
Console.Read();
}
}
}
}
另,可以通过App.config配置服务。如下:
a、配置App.config,同创建WCF Service Library项目产生的App.config
<configuration>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<services>
<service behaviorConfiguration="WCFServiceLibrary.Service1Behavior"
name="WCFServiceLibrary.PersonService">
<endpoint address="" binding="wsHttpBinding" contract="WCFServiceContract.IPersonService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/WCFServiceLibrary/PersonService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFServiceLibrary.Service1Behavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
b、启动ServiceHost
using System.ServiceModel;
using WCFServiceLibrary;
using WCFServiceContract;
using System.ServiceModel.Description;
namespace WCFWinAppService
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(PersonService)))
{
host.Opened += delegate { Console.WriteLine("PersonService已经启动,按Enter键终止服务!"); };
host.Open();
Console.Read();
}
}
}
}
5、WCFClientDemo:一个Console Application项目模拟服务的客户端,该项目引用System.ServiceMode程序集。
有两种方式调用服务,一种是定义服务代理类,现实项目中几乎不会这样使用。
另一种是使用ChannelFactory创建服务代理类,如下:
using System.ServiceModel;
using WCFServiceContract;
using WCFDataContract;
namespace WCFClientDemo
{
class Program
{
static void Main(string[] args)
{
string url = "http://localhost:9999/personservice";
//string url = "http://localhost:8731/WCFServiceLibrary/PersonService";
//string url = "http://localhost:6094/PersonService.svc";
using (ChannelFactory<IPersonService> channelFactory = new ChannelFactory<IPersonService>(new WSHttpBinding(), url))
{
IPersonService proxy = channelFactory.CreateChannel();
using (proxy as IDisposable)
{
Person person = new Person();
person.Name = "Fly";
person.Age = proxy.GetPersonAge(person.Name);
person.Contact = proxy.GetPersonContact(person);
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.Contact.Address);
Console.WriteLine(person.Contact.Mail);
}
}
}
}
}
当然,可以通过配置app.config,如下:
<configuration>
<system.serviceModel>
<bindings />
<client>
<endpoint address="http://localhost:9999/personservice" binding="wsHttpBinding" contract="WCFServiceContract.IPersonService" name="PersonService" />
</client>
</system.serviceModel>
</configuration>
那么在创建ChannelFactory<T>的时候,就无须再指定终结点的绑定和地址了,而只须制定对应的终结点配置名称。