代码

https://yunpan.cn/cPns5DkGnRGNs   密码:3913


 

在上一讲中我们说到 在代码 当中  完成了 服务的寄宿。

这里我们说下 在实际的开发 当中 我们一般不会去使用代码的方式去完成服务的寄宿,一般都是  通过配置文件的方式 去完成服务器的寄宿。

所以我们这里介绍下 关于 配置文件 服务的寄宿

应用程序 启动起来之后 它会自动的去读取 应用程序配置文件

忘记提醒 我所使用的开发工具为  VS2013 ,Sqlserver2012

好,我们继续

我们打开 Hosting 项目 的  App.config 文件

里面键入

[ 2-01 ]

解释一下  这里的配置:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <!--WCF服务寄宿的配置 Start --> <!--首先需要添加一个节点-->
<system.serviceModel> <!--这里就是行为的集合-->
<behaviors>
<!--这里是绑定的行为-->
<serviceBehaviors>
<!--那么绑定的行为具体是什么行为 这里 name 给它起个名字-->
<behavior name="metadataBehavior">
<!--配置这个行为可以 HTTP GET形式的访问(httpGetEnabled="true") 然后指定元数据地址(httpGetUrl="http://127.0.0.1:6666/calculatorservice/metadata")-->
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:6666/calculatorservice/metadata"/>
</behavior>
</serviceBehaviors>
</behaviors> <!--这里就是当前整个服务的配置-->
<services>
<!--然后这里 《 引用具体的行文,将刚才配置的行为名称写到这里(behaviorConfiguration="metadataBehavior") 》 并且 《 契约的 实现服务( name="Services.CalculatorService" ) 注意:必须写 项目的 完整名称 必须加上 空间的名称 》 -->
<service behaviorConfiguration="metadataBehavior" name="Services.CalculatorService">
<!--终结点 EndPoint 的配置 A,B,C 注意: 这里的 C 契约 必须写 项目的 完整名称 必须加上 空间的名称 -->
<endpoint address="http://127.0.0.1:6666/calculatorservice" binding="wsHttpBinding" contract="Contracts.ICalculator"></endpoint>
</service>
</services> </system.serviceModel> <!--WCF服务寄宿的配置 End --> </configuration>

好,这里我们完成 了 Web.config 的配置

注意这里 为EndPoint 配置 URL  本地 访问地址的时候 一定 要指定 端口号

接下来我们来看看 寄宿 的 代码

按照之前的代码肯定会出错的,所以这里需要重新修改一下:

[ 2-02 ]

 using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;
using Contracts;
using Services; namespace Hosting
{
class Program
{
static void Main(string[] args)
{
//首先提供一个主机进程,实际上就是完成寄宿的主机( CalculatorService 完成了对契约的实现,所以我们这里就寄宿就寄宿它了 )
using (var host = new ServiceHost(typeof(CalculatorService)))
{
//指定一个事件,当服务启动之后 需要做什么,这里指定一个委托,在 Open 成功后,就执行这里的事件
host.Opened += (sender, eventArgs) => Console.WriteLine("服务已经启动,按任何按钮停止");
//开启服务
host.Open();
Console.Read();
}
}
}
}

好这里我们就完成了  WebConfig 方式的  寄宿

可以运行起来试一下,好,完好,这里就不再贴图片了。


接下来我们来说说  客户端 调用服务

客户端 调用服务

首先我们需要  先启动 Hosting

找到Hosting 的 控制台程序 启动   ,  然后 Client 项目   引用    添加服务引用   输入上面我们 发布的元数据地址:http://127.0.0.1:6666/calculatorservice/metadata

看图

[ 2-03 ]

[ 2-04 ]

好了,这里我们的服务就引用成功了。

就多了个 “ Service References ” 的文件夹

并且 看我们的客户端的 WebConfig 中 也多出了  一些配置,这些配置是微软自动帮我们生成的, 而这些配置的相关节点  跟我们 服务端 的 配置  几乎相同。

[ 2-05 ]

好的 关于 配置文件我们就说到这里,后面我们会继续讲到。

前面 我们的 添加服务引用  已经添加引用了,配置文件也  自动生成好了 。

接下来,就是 客户端的  代码问题了:

首先我们看下  我们 添加的服务

[ 2-06 ]

双击 ” CalculatorClient “    进入

[ 2-07 ]

由此我们可见  CalculatorClient  继承与   System.ServiceModel.ClientBase,  System.ServiceModel.ClientBase是  提供基实现,用于创建可调用服务的 Windows Communication Foundation (WCF) 客户端对象。

所以,这里如果我们要调用  服务的方法,就必须先创建  CalculatorClient  ,说白了  CalculatorClient   就是我们客户端的 代理

[ 2-08 ]

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Client.CalculatorService; namespace Client
{
class Program
{
static void Main(string[] args)
{
//创建客户端代理
var proxy = new CalculatorClient();
//调用服务的方法(这里 看下 之前 的契约,这个 Add 的方法 就是从契约中暴露出来的)
var returnvar = proxy.Add(, );
//输出
Console.WriteLine(returnvar);
Console.Read();
}
}
}

所有的 工作  都完成了,我们测试一下:

[ 2-09 ]

[ 2-10 ]

好的 ,也都  运行正常 !


上面我们说的通过服务引用的方式来调用服务方法,还有一种 是 创建信道工厂的方式去 完成 服务的调用,说实在的,我更倾向于 第二种信道工厂的方式去创建服务代理,因为信道工厂更加灵活。

信道工厂 ChannelFactory

我们来修改下客户端的代码:

[ 2-11 ]

 using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using Contracts; namespace Client
{
class Program
{
static void Main(string[] args)
{
//信道工厂
//建立服务通信的代理,这里也是参数,A,B,C
using (ChannelFactory<ICalculator> changFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:6666/calculatorservice"))
{
//建立通道
ICalculator proxy = changFactory.CreateChannel();
//通道使用完成之后自动销毁
using (proxy as IDisposable)
{
//服务调用
var returnvar = proxy.Add(, );
Console.WriteLine(returnvar);
Console.Read();
}
}
}
}
}

既然服务器的 都推荐 使用 配置文件方式 配置  服务的寄宿

那么我们 客户端 就不能 使用配置文件的方式  去配置  EndPoint 访问点,答案当是  可以的。

[ 2-12 ]

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint address="http://127.0.0.1:6666/calculatorservice" binding="wsHttpBinding" contract="Contracts.ICalculator" name="calculatorservice"></endpoint>
</client>
</system.serviceModel>
</configuration>

当然 客户端 的代码 也发生的 响应的变化:

[ 2-13 ]

 using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using Contracts; namespace Client
{
class Program
{
static void Main(string[] args)
{
//信道工厂
using (ChannelFactory<ICalculator> changFactory = new ChannelFactory<ICalculator>("calculatorservice"))
{
//建立通道
ICalculator proxy = changFactory.CreateChannel();
//通道使用完成之后自动销毁
using (proxy as IDisposable)
{
var returnvar = proxy.Add(, );
Console.WriteLine(returnvar);
Console.Read();
} } }
}
}

到这里我们 就可以感受到了 协议与客户端之间的关系?

客户端与服务之间应该共享契约,而不是代码,也就是它们之间的耦合性不是基于代码的耦合,而是基于契约的。在契约中不包含具体的服务逻辑,这样为我们构建松耦合的分布式系统提供了良好的技术。

契约与元数据最终生成客户端代理和配置.


好了,我们就先介绍到这里吧。

再这之前,我们都是稍微了解下 WCF 的 创建,后面我们再将  一些细节   例如  契约(几种契约,每种契约的特点 等),绑定协议(几种绑定协议,几种绑定协议的不同点 等)   ........

结束

第二讲:WCF介绍(2)的更多相关文章

  1. python学习第二讲,pythonIDE介绍以及配置使用

    目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...

  2. 购物商城学习--第二讲(maven工程介绍)

    接下来第二讲介绍整体工程如何使用maven搭建的. 使用maven管理工程的好处: jar包的管理: 工程之间的依赖管理: 自动打包 maven常见打包方式:jar.war和pom三种.jar工程,是 ...

  3. 第三讲:WCF介绍(3)

    代码 https://yunpan.cn/cPns5DkGnRGNs   密码:3913   前面我们通过一个小的例子,大概了解的WCF. 这里我们补充下  EndPoint 配置  A,B,C  中 ...

  4. 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

    [军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的   之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...

  5. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  6. 常见注入手法第二讲,APC注入

    常见注入手法第二讲,APC注入 转载注明出处 首先,我们要了解下什么是APC APC 是一个简称,具体名字叫做异步过程调用,我们看下MSDN中的解释,异步过程调用,属于是同步对象中的函数,所以去同步对 ...

  7. WebApp 安全风险与防护课堂(第二讲)开课了!

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...

  8. 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  9. POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

    第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...

  10. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7700772 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

随机推荐

  1. 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  2. Lucene系列-索引文件

    本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...

  3. .NET面试基础知识

    1.    什么是Asp.Net? 答:Asp.Net是一种基于.NET平台下的动态web开发技术,它使用的是codebehind(代码后置技术),可以将前台呈现和后台代码进行有效的分离.   2.  ...

  4. Centos Another app is currently holding the yum lock

    yum命令用ctrl+z命令中断后,再运行yum时,出现: Existing lock /var/run/. Another app is currently holding the yum lock ...

  5. java 锁2

    并发,其实是多线程才有的场景... java 多线程? 锁? 现在看来,即使已经工作了4.5年,这仍然不是一个简单的问题. 其实java 本身有提供锁的机制. 比如 Object对象的 wait .n ...

  6. 这里有个坑---[NotMapped]不要忘了加

    这里有个坑,我们定义实体的时候如果使用了在数据库没有的字段记得加[NotMapped]---------每一个遇到的坑总结后都是一比财富. 在项目中我们一般会使用EF等ORM框架来为我们服务,在ORM ...

  7. golang开发缓存组件

    代码地址github:cache 花了一天时间看了下实验楼的cache组件,使用golang编写的,收获还是蛮多的,缓存组件的设计其实挺简单的,主要思路或者设计点如下: 全局struct对象:用来做缓 ...

  8. js 事件

    事件:一般用于浏览器与用户操作进行交互 js事件的三种模型:内联模型.脚本模型.DOM2模型 内联模型:事件处理函数是HTML标签的属性 <input type="button&quo ...

  9. 开始使用MarkDown写博客

    MarkDown 标题 #h1 ##h2 ###h3 h1 h2 h3 代码段 代码段缩进4个空格即可,如下: <div class="form-group"> < ...

  10. No compatible targets were found.Do you wish to...的解决方案。

    首先看问题,这个错误是说明没有android虚拟机,那么新建一个就OK了. 假如出现了这个状况:就点击yes,然后new一个: 添加Name等等的属性,点击ok,再运行就可以了. 这种情况一般是第一次 ...