创建Solution
1、WCFDataContract:一个类库项目,定义契约数据对象,引用System.Runtime.Serialization程序集。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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程序集。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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"
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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节点下添加:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
< 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程序集。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
< 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
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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创建服务代理类,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
< configuration >
< system.serviceModel >
< bindings />
< client >
< endpoint address ="http://localhost:9999/personservice" binding ="wsHttpBinding" contract ="WCFServiceContract.IPersonService" name ="PersonService" />
</ client >
</ system.serviceModel >
</ configuration >
那么在创建ChannelFactory<T>的时候,就无须再指定终结点的绑定和地址了,而只须制定对应的终结点配置名称。