WCF 程序入门

时间:2024-01-19 11:31:56

  WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型,是建立在消息通信这一概念基础上运行的一个运行时服务系统。

  WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务端和WCF客户端。该编程模型封装在.NET框架的System.SericeModel命名空间中。

   利用WCF,开发人员不再根据不同的需求分别选择不同的模型,而是只用一种模型,就可以用统一的格式和用法编写各种网络应用程序,从而构建安全的,可靠的,跨平台(包括Windows平台和非Windows平台)的分布式解决方案。

一 WCF示例

  1 创建服务端项目和客户端项目

    一般为了方便调试和观察,一般在同一个解决方案中既包括WCF服务端应用程序项目,也包括客户端应用程序项目。但是,在实际的项目开发中,由于用【WCF服务应用程序】模板创建的服务是通过IIS单独部署的,所以应分别用不同的解决方案来实现。

    (1)选择【WPF应用程序】模板,新建一个客户端应用程序项目。解决方案名WcfServiceTest,项目名为Client。

    (2)创建服务端

      在【解决方案管理器】中,右键单击解决方案名,选择【添加】-->【新建项目】,在弹出的窗口中选择【WCF服务应用程序】模板,单击【确定】,此时系统会自动添加对System.ServiceModel命名空间的引用,并自动在该项目中生成一下文件。

      • IService.cs:用接口定义服务协定和数据协定
      • Service.svc和Service.svc.cs:实现IService1接口中声明的服务操作
      • Web.config:服务器端配合文件,用于定义服务行为以及绑定的协议等          

    (3)添加新服务(可选)

       如果不希望使用默认的WCF服务Service1,可以利用【重构】将其替换成其他名称,或者删除IService.cs,IService.svc,IService.svc.cs,然后按照下面的方法创建或添加新服务。右击项目名,选择【添加】-->【WCF服务】命令,在弹出的窗口中将【项名称】改为新的WCF服务名称,单击【确定】按钮。

   2 编写服务端代码

      此部分的主要工作就是设计和实现协定,包括服务协定,数据协定以及消息协定。

      服务协定用ServiceContract特性来声明,用接口来定义。在借口内部,用方法及其参数声明服务提供的操作,在接口中声明的这些方法统称为“操作方法”。注意在服务协定中只能声明操作方法,不允许声明属性和字段。

    (1)定义接口(IService.cs)

    [ServiceContract]
public interface IService1
{
// TODO: 在此添加您的服务操作 [OperationContract] string SayHello(string name);
[OperationContract] double Add(double d1, double d2);
[OperationContract] double Divide(double d1, double d2);
}

    (2)实现接口声明的操作方法(Service.svc.cs)

    public class Service1 : IService1
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
} public double Add(double d1, double d2)
{
return d1 + d2;
} public double Divide(double d1, double d2)
{
return d1 / d2;
}
}    

  代码编写完毕后,右键单击WcfService项目名,选择【生成】或【重新生成】,以确保没有语法错误。

  3 修改服务端配置

    (1)修改绑定配置(Web.config)文件,找到protocolMapping配置节,在其上方添加以下代码:

    <bindings>
<basicHttpBinding>
<binding name ="b1" transferMode ="Buffered" textEncoding="utf-8" messageEncoding ="Text">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>

      将protocolMapping配置节的代码改为一下内容:

    <protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>

      在protocolMapping配置节的下方添加以下代码:

    <services>
<service name="WcfService1.Service1">
<endpoint binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService1.IService1" />
</service>
</services>

    (2)开通调试功能

      在Web.config中找到includeExceptionDetailInFaults,将其改为true。

          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="true"/>

  4 测试服务(可选)

    用【WCF应用程序】模板创建WCF服务后,如果需要,可以直接利用【WCF测试客户端】来测试每个服务操作。

    右击WcfService文件名,选择【设为启动项目】命令,并选中要测试的Service.svc文件名(测试那个服务就选中哪个.svc文件),然后按<F5>调试运行,此时系统会自动弹出WCF测试客户端。

    测试结束后,要再将WPF应用程序设为启动项目。

  5 在服务端添加引用

    (1)确保服务已经启动

      单击WcfService项目,选择【生成】或【重新生成】,若WCF服务没有启动,则会失败。

    (2)查找引用的服务

      单击Client项目中的【引用】-->【添加服务引用】,在弹出的对话框中,单击【发现】,此时会自动找到与该项目在同一个解决方案中俄的WCF服务

    (3)生成客户端代码

using Client.ServiceReference1;
        private void btn1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "客户端调用sayhello方法,服务端返回:\n";
//创建服务客户端
Service1Client client = new Service1Client();
//调用服务
string s = client.SayHello("欢迎学习WCF!");
//关闭服务客户端并清理资源
client.Close();
textBlock1.Text += s;
}