现在的位置: 首页 > 综合 > 正文

WCF 入门例子

2013年06月23日 ⁄ 综合 ⁄ 共 3650字 ⁄ 字号 评论关闭

    刚开始研究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) 先后启动服务器和客户端,客户端应该显示当前时间。

抱歉!评论已关闭.