这篇博客将介绍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(,));
Console.WriteLine(proxy.Divide(, ));
Console.WriteLine(proxy.Multiply(, ));
Console.WriteLine(proxy.Subtract(, )); 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服务,

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

感谢您的阅读!

WCF学习笔记之WCF初识的更多相关文章

  1. WCF学习笔记(2)-WCF的通讯过程

    一.WCF中的ABC 场景:公司让你送一份合同文件,送文件的过程你可以选择的交通方式有打的,地铁或公交. 到了对方公司后,你要找到某负责人,并且要一份收到合同文件的回执和相应文件 要完成这项工作任务主 ...

  2. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  3. WCF学习笔记之传输安全

    WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...

  4. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  5. WCF 学习笔记之双工实现

    WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...

  6. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  7. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  8. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  9. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

随机推荐

  1. CentOS6.5安装Tab增强版:bash-completion

    CentOS6.5安装Tab增强版:bash-completion,可补全命令参数: 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首 ...

  2. 安装courier-authlib找不到mysqlclient.so文件

    使用configure配置的时候使用 --with-authmysql指明libmysqlclient.so的存放位置即可

  3. Qt不同类之间信号槽连接

    1.类必须继承QObject. #ifndef TESTA_H #define TESTA_H #include <QObject> class TestA : public QObjec ...

  4. WdatePicker组件不显示

    突然发现时间组件不显示了,以为是浏览器的问题.在本地服务器测试了一下发现一切正常. 怀疑是前段时间中毒引起的,用工具比对了一下WdatePicker的文件包,发现My97DatePicker.htm这 ...

  5. RSA 加解密转换

    由于项目的原因,原来的项目使用.net 进行开发,现在需要转成java, 所以原来的加解密就成了一个棘手的问题.由于数据使用RSA签名加密,又因为.net 和 Java 加解密算法上的差异,并不能使用 ...

  6. eclipse修改项目名称

    一. 右键工程:Refactor->Rename,或选中工程按F2,修改名称二.右键工程:Properties->Web Project Settings,修改Context Root 三 ...

  7. 【轮子】发现一个效果丰富酷炫的Android动画库

    没有什么比发现一个好轮子更让人开心的了. 这个库分分钟提高交互体验 :AndroidViewAnimations 一张图说明一切 配置和使用也相当简单 GitHub地址

  8. 51nod 1605 棋盘问题 (博弈)

    题目:传送门. 题意:中文题.T组数据,每组给定一个n*m的棋盘,棋盘中的1代表黑色,0代表白色,每次可以将1或者非2质数的全黑色方形区域变为白色,不能操作者输,问谁能赢. 题解:每次可以将1或者非2 ...

  9. IOS - 内购

    内购的五种产品类别 •非消耗品(Nonconsumable)买了就有,头衔,功能 –指的是在游戏中一次性购买并拥有永久访问权的物品或服务.非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用 ...

  10. 生成Geometry

    // 由一组点集生成一张三角面片网格Geometry osg::Geometry* createTRIANGLESGeometry(MyMesh &mesh) { osg::ref_ptr&l ...