刚开始研究WCF,这里尝试以最简单的方式构建搭建WCF的运行环境。一般用WCF有两种方式,一种是提供大的后台Service,这个可能发布到公网,一般使用http协议,宿主到IIS里面,然后另外一个Asp.Net网站或WPF之类的程序作为客户端来调用服务。另外一种是用来内部通讯,一般宿主到控制台程序来开发测试,宿主到windows service来发布。下面以一个简单的服务例子说明服务搭建过程。
1. http协议,服务端和客户端都是web。
1) 在vs里选择‘WCF->WCF应用程序’模板新建一个项目。
2) 项目里面新建两个文件夹,一个是Def用来放接口定义类,一个是Impl用来放服务实现类。
3) Def里面添加ITimeService.cs, 代码如下:
[ServiceContract]
public interface ITimeService
{
[OperationContract]
DateTime GetNow();
}
这里省略了命名空间,不识别的类型右键解析一下。下面的代码类似。
4) Impl目录里面添加TimeService0.cs,代码如下:
public class TimeService0 : ITimeService
{
public DateTime GetNow()
{
return DateTime.Now;
}
}
5) 将项目自动生成的IService1.cs干掉,将Service1.svc重命名成TimeService.svc, TimeService.svc.cs代码修改如下:
[ServiceBehavior(Namespace="Services", Name="Time")]
public class TimeService : TimeService0
{
}
6) 按F5启动WCF服务,浏览器会弹出一个页面,点击TimeService.svc, 会显示服务描述,这个地址一般为http://localhost:8481/TimeService.svc,端口可能变化。
7) 新建一个Asp.Net Web 应用程序WcfClient,添加服务引用,地址为http://localhost:8481/TimeService.svc。
8) 在Default.aspx里面添加一个标签:<asp:Label ID="txt1" runat="server"></asp:Label>
9) 后台代码修改如下:
protected void Page_Load(object sender, EventArgs e)
{
TimeServiceClient timeServiceClient
= new TimeServiceClient();
txt1.Text = timeServiceClient.GetNow().ToString("yyyy年MM月dd日 hh时mm分ss秒");
}
10) 先后启动Wcf服务项目和Asp.Net项目,Asp.Net项目的网页里应该会显示当前时间,刷新页面时间也会刷新。
11) 发布时在IIS7里面添加网站,填入网站名称并将物理路径设置成WCF应用程序项目目录即可。注意目录必须赋予IIS用户IIS_IUSRS读取和执行权限,具体参考下面链接设置权限:http://utervnx.blog.163.com/blog/static/14387703201052185627486/
2. tcp协议,内部通讯,服务端和客户端都是控制台程序,这里我们不适用任何wcf模板,也不自动生成代码,完全用手工实现。
1) 新建一个类库项目ServiceInterface1,添加对System.ServiceModel的引用。
2) 增加ITimeService.cs,代码如下:
[ServiceContract]
public interface ITimeService
{
[OperationContract]
DateTime GetNow();
}
3) 新建一个控制台应用程序WinService1作为服务端,将目标框架变成.Net Framework 4 并添加System.ServiceModel的引用。
4) 增加类TimeService.cs,代码如下:
public class TimeService : ITimeService
{
public DateTime GetNow()
{
return DateTime.Now;
}
}
5) 在Program.cs里增加服务启动代码:
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(TimeService)))
{
host.Open();
Console.WriteLine("Service starts.");
Console.ReadKey();
host.Close();
}
}
6) 配置文件app.config如下:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<services>
<service name="WinService1.TimeService" behaviorConfiguration="WinService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/WinService"/>
<add baseAddress="net.tcp://localhost:8080/WinService"/>
</baseAddresses>
<timeouts openTimeout="00:01:00" closeTimeout="00:01:00"/>
</host>
<endpoint name="TimeService" address="TimeService" binding="netTcpBinding" contract="ServiceInterface1.ITimeService"/>
<endpoint address="mex" binding="mexTcpBinding" name="MEX" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WinService">
<serviceDebug includeExceptionDetailInFaults="True"/>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
7) 再新建一个控制台应用程序WinService1Client作为客户端,将目标框架变成.Net Framework 4 并添加System.ServiceModel的引用。
8) 添加TimeServiceClient.cs:
class TimeServiceClient : ClientBase<ITimeService>, ITimeService
{
public System.DateTime GetNow()
{
return base.Channel.GetNow();
}
}
9)Program.cs代码:
static void Main(string[] args)
{
TimeServiceClient client = new TimeServiceClient();
Console.WriteLine(client.GetNow());
Console.ReadKey();
}
10) 配置文件:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8080/WinService/TimeService"
binding="netTcpBinding" contract="ServiceInterface1.ITimeService" name="TimeService">
</endpoint>
</client>
</system.serviceModel>
</configuration>
11) 先后启动服务器和客户端,客户端应该显示当前时间。