using System;
using System.ServiceModel;
using System.Text;
namespace Server
{
/// <summary>
/// 用ServiceContract来标记此接口是WCF的服务契约,可以像WebService一样指定一个Namespace,如果不指定,就是默认的http://tempuri.org
/// </summary>
[ServiceContract(Namespace="WCF.Demo")]
public interface IData
{
/// <summary>
/// 用OperationContract来标记此方法是操作契约
/// </summary>
[OperationContract]
string SayHello(string userName);
}
}
using System;
using System.Text;
namespace Server
{
/// <summary>
/// 实现IData接口,此处不需要写契约标记
/// </summary>
public class DataProvider : IData
{
public string SayHello(string userName)
{
return string.Format("Hello {0}.", userName);
}
}
}
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!-- 看到services节,就表明这是在定义服务相关的内容 -->
<services>
<!-- 定义一个服务,name是契约实现类的全名 -->
<servicename="Server.DataProvider">
<!-- 既然要对外提供服务,就要有服务地址,此处定义为 http://localhost:8080/wcf,需要注意,地址总是带着类型标头的 -->
<host>
<baseAddresses>
<addbaseAddress="http://localhost:8080/wcf"/>
</baseAddresses>
</host>
<!-- 定义一下终节点,address一般为空,如果不为空,最终服务地址就是在baseAddress的基础上加上这个address,binding指定为basicHttpBinding,这是最基础的基于http的绑定方式,contract标明这是为哪个契约服务 -->
<endpointaddress=""binding="basicHttpBinding"contract="Server.IData"/>
</service>
</services>
</system.serviceModel>
</configuration>
using System;
using System.ServiceModel;
namespace Server
{
class Program
{
static void Main(string[] args)
{
//定义一个ServiceHost,注意参数中要使用契约实现类而不是接口
using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
{
host.Open();
Console.WriteLine("Service Running ...");
Console.ReadKey();
host.Close();
}
}
}
}
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
TCP [::]:8080 [::]:0 LISTENING 4
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!-- 看到client,就表明是客户端设置 -->
<client>
<!-- 定义访问时的终节点,name也是随意取的,注意address是Server端发布时指定的baseAddress+endpoint的address,binding也要对应,contract就更不用说了,由于之前把IData.cs拷过来的时候没有修改命名空间,所以还是Server.IData -->
<endpointname="DataService"address="http://localhost:8080/wcf"binding="basicHttpBinding"contract="Server.IData"/>
</client>
</system.serviceModel>
</configuration>
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace Client
{
class Program
{
static void Main(string[] args)
{
//客户端访问有多种方式,此处只显示一种
//利用ChannelFactory的CreateChannel方法创建一个IData的代理对象,其中参数“DataService”就是刚才在App.config中定义的endpoint的名称
var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();
//调用SayHello方法
Console.WriteLine(proxy.SayHello("WCF"));
//用完后一定要关闭,因为服务端有最大连接数,不关闭会在一定时间内一直占着有效连接
((IChannel)proxy).Close();
}
}
}