WCF学习笔记之WCF初识

这篇博客将介绍WCF的最基础内容,让我们对WCF有一个基本的认识。后续的博客中将会介绍WCF其他方面内容。本篇博客将通过一个简单的例子,介绍如何创建WCF服务,并承载这个服务,让客户端来访问它。下面请看项目结构。

Client与Hosting是控制台程序,Hosting工程需要添加Contract,Service工程和System.ServiceModel名称空间。Contract工程是类库工程,需要添加System.ServiceModel名称空间,Service工程也是类库工程,需要添加Contract工程引用和System.ServiceModel名称空间。

在Contract类库中添加ICalculateService接口,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace Contract
{
    [ServiceContract]
    public interface ICalculateService
    {
        [OperationContract]
        double Add(double x, double y);

        [OperationContract]
        double Subtract(double x, double y);

        [OperationContract]
        double Divide(double x, double y);

        [OperationContract]
        double Multiply(double x, double y);
    }
}

在Service类库中新建CalculateService类,实现ICalculateService方法。

using Contract;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Service
{
    public class CalculateService : ICalculateService
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Divide(double x, double y)
        {
            return x / y;
        }

        public double Multiply(double x, double y)
        {
            return x * y;
        }

        public double Subtract(double x, double y)
        {
            return x - y;
        }
    }
}

此时WCF服务的契约和实现已经完成了,下面对这个服务进行承载,对WCF的承载有很多种方式,这篇博客介绍通过Console程序和IIS来承载WCF服务。
1. 通过Hosting控制台程序来承载。需要在配置文件(app.config/web.config)中添加服务的终结点,

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <system.serviceModel>
    <services>
      <service name="Service.CalculateService" 
               behaviorConfiguration="CalculateServiceBehavior">
        <endpoint 
          address="" 
          binding="basicHttpBinding" 
          contract="Contract.ICalculateService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        
        <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://192.168.1.104/CalculateService"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculateServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

承载服务

using (ServiceHost host = new ServiceHost(typeof(CalculateService)))
{
    host.Opened += delegate 
    {
        Console.WriteLine("Service is opened.");
    };

    host.Open();

    Console.ReadKey();
}

运行Hosting程序,在浏览器中访问配置文件中服务的地址,

这就说明我们的服务已经部署成功,下面可以来引用服务,并调用服务公开的方法。

在Client工程右击选择Add Service References

输入服务地址,点击Go,可以找到我们已经部署的服务。

我个人比较喜欢通过SvcUtil命令生成Service的客户端代理类,打开Developer Command prompt for VS2015工具,输入SvcUtil /out:D:\CalculateServiceProxy.cs /config:D:\app.config http://192.168.1.104/CalculateService

直接通过命令行方式生成代理类很简洁,也便于在团队开发中控制(个人观点)。

将生成的CalculateServiceProxy类拷贝到Client工程下Services目录中,替换Client工程中App.config文件内容。下面对服务进行调用,

    using (CalculateServiceClient proxy = new CalculateServiceClient())
    {
        Console.WriteLine(proxy.Add(2,3));
        Console.WriteLine(proxy.Divide(2, 3));
        Console.WriteLine(proxy.Multiply(2, 3));
        Console.WriteLine(proxy.Subtract(2, 3));

        Console.ReadKey();
    }

运行效果如下:

2. 通过IIS来承载WCF服务,我们只需要做一点点的改变即可,再新建一个类库工程叫IISHosting,引用Contract,Service两个类库,添加一个配置文件叫Web.config, 将上面配置文件的内容复制到Web.config中,删除host节点的内容,再新建一个叫做CalculateService.svc文件,添加如下代码:

<%@ ServiceHost Service="Service.CalculateService" Language="C#" %>

编译类库工程,新建一个文件夹叫做CalculateService,将Web.config, CalculateService.svc文件放在里面,另外在文件夹中新建bin文件夹,将编译后Debug目录下Contract.dll, Service.dll拷贝到其中。
打开IIS控制台,在默认站点下新建一个程序叫做CalculateService,虚拟目录指向新建的CalculateService文件夹地址。

注意因为我是基于.NET 4.5.2的环境开发的WCF服务,所以请将Application Pool选择为ASP.NET 4.0模式。通过浏览器访问WCF服务,

服务的调用和上面的控制台承载方式一致。代码点击这里下载。

感谢您的阅读!

posted @ 2016-02-14 22:11  Yang-Fei  阅读(563)  评论(0编辑  收藏  举报