年前辞职-WCF入门学习(3)
前言
[2了,刚写好的,手贱,点了删除,还真TMD的删除了,只好重写]
今天周六,去同事家聚了一个餐,感觉各种豪华。
废话不多说,前两集大致介绍了一下什么是WCF以及和WCF相关的WebService和.net Remoting的一些东西,今天主角要上场,开始WCF的实现相关的东西。
第三集 Create a WCF Service
挂了vpn来看youtube的视频,感觉还是慢,算了,干脆下载了看。
这一集主要有以下四个点
- 创建一个WCF服务
- 用一个控制台程序来托管这个服务
- 提供两个Endpoint
- 创建一个windows 和一个 Web客户端程序
先上一张上一集的图,
从图中可以看到,为了给java 和.net 两个客户端提供他们需要的服务,我们需要实现两个东西,一个是WebService 一个是 .net Remoting ,虽然他们的功能是一样的。
接下去是WCF的实现方式:
从图中可以知道,我们只需要写一个服务,然后配置两个Endpoint即可满足需求。
Let ‘s do IT。
首先,创建一个解决方案,添加一个新类库,取名HelloService
然后,删除vs 自动生成的Class1.cs 再添加一个WCF服务 新项(右上角可以搜索)取名HelloService。
确定之后我们看一下项目目录结构。
首先是引用这块。vs 自动添加了对System.ServiceModel 命名空间的引用,这个是WCF的核心命名空间。
然后是vs生成了2个文件,一个HelloService 一个 IHelloService。
让我们来看一下这两个文件。
首先是IHelloService文件
[ServiceContract]
public interface IHelloService
{
[OperationContract]
void DoWork();
}
看名字就知道这是一个接口,接口所具有的ServiceContract 特性来自于ServiceModel 命名空间,接口里面包含一个方法定义,DoWork(),方法有一个OperationContract特性也是来自ServiceModel 。
接下去是HelloService文件
public class HelloService : IHelloService
{
public void DoWork()
{
}
}
只是简单的实现了IHelloService 接口。
现在,我们对两个文件做些修改,来实现我们自己的服务。
把IHelloService 改成如下:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string GetMessage(string name);
}
即删除了原先的DoWork方法,改成一个返回String类型的GetMessage方法,传入一个name参数。
相应的,HelloService也要变。
public class HelloService : IHelloService
{
public string GetMessage(string name)
{
return "Hello " + name;
}
}
我们实现了里面的GetMessage方法,让他返回我们需要字符串。
至此,创建工作就已完成,接下去就是在控制台程序中托管这个服务。需要说明一点,WCF的托管对象可以是Winform,Console ,或者IIS,或者windows 服务以及其他。为了简化问题,这里选中托管到Console中。
首先,在当前解决方案中新添加一个控制台项目,取名HelloServiceHost
点击确定,
然后,要对这个Host添加两个引用,一个上面的System.ServiceModel,另一个是上面的WCF项目。
然后会得到如下的引用目录。
为了托管这个WCF服务,我们需要给项目添加一个配置文件,用于托管这个WCF服务。
右键Host项目,选择添加新项,应用程序配置文件,名字就是默认的App.config
重头戏来了,写这个配置文件,然他可以给两个不同的客户端提供服务。
完整版如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="HelloService.HelloService" behaviorConfiguration="mexBehavior">
<endpoint address="HelloService" binding="basicHttpBinding" contract="HelloService.IHelloService"></endpoint>
<endpoint address="HelloService" binding="netTcpBinding" contract="HelloService.IHelloService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080"/>
<add baseAddress="net.tcp://localhost:8090"/>
</baseAddresses>
</host>
</service>
</services> <behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
</configuration>
解释一下,首先是这个endpoint,他有3个参数,很好记,缩写ABC。
- Address 地址,用来指定服务的位置。注意,如果没有特殊描述,那么就是一个相对地址,实际的地址由下面的baseAddress+address构成。
- Binding 绑定,给出了协议和编码信息,详细的编码列表如下。
如图在serviceModel节点下面输入一个bindings元素,然后输入一个小于号,就可以看到所有的列表。我们前期如果不熟悉用什么,可以用这种方式来复制粘贴到endpoint里面
- Contract 协议,定义了服务提供的操作。具体的内容就是我们定义的IHelloService WCF服务所在位置,即他的命名空间HelloService + 名字 IHelloService = HelloService.IHelloService。
endpoint根据需要,我们只要定义2个,但是,一般来说,我们会再定义一个用于元数据交换的mex 端点,关于什么这个端点的作用,如果你写过WebService,知道WSDL,那就很好理解了,他就是WCF中的WSDL,用来描述服务的操作很消息。
上面说了,我们用的endpoint里面的地址是相对地址,所以要定义一个baseAddresses,在host元素里面,里面两个baseAddress,一个http协议的地址,一个tcp协议的地址。
接着是behaviors节点,里面定义了serviceMetadata是否允许httpGet
配置文件方面介绍完毕,下面要在控制台中托管这个服务。
打开program.cs ,
因为原先已经引用过system.ServiceModel 命名空间,所以编写如下代码:
static void Main(string[] args)
{
using(var host = new ServiceHost(typeof(HelloService.HelloService))) {
host.Open();
Console.WriteLine("Host 在" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "启动");
Console.ReadLine();//防止控制台程序自动关闭
}
}
然后运行该Host,得到如下界面。
可知,host已经启动生效。
自己在写的时候碰到个问题,
如果vs不是以管理员方式运行,会得到下面这个异常提示:
提示无权访问这个命名空间。所以,只要重启vs,并且以管理员方式运行即可。
启动了Host之后,接下来就要调用了。
java没有装,所以就用web项目来代替了。
重新打开一个vs,记得以 管理员 方式运行,新建一个网站,简单起见,就用aspx网站。然后给该网站添加服务引用。
因为上面已经启动了Host,输入地址http://localhost:8080 点击转到,得到一个服务,然后把命名空间改成HelloService,点击确定,然后我们看一下根目录下的web.config 文件。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IHelloService" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IHelloService" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IHelloService" contract="HelloService.IHelloService"
name="BasicHttpBinding_IHelloService" />
<endpoint address="net.tcp://localhost:8090/HelloService" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IHelloService" contract="HelloService.IHelloService"
name="NetTcpBinding_IHelloService">
<identity>
<userPrincipalName value="此处省略~~" />
</identity>
</endpoint>
</client>
</system.serviceModel>
可以看到,config里面添加了一个serviceModel 节点,内容是我们前面定义的binding 和 endpoint。
右键该网站然后新添一个页面,然后添加一个textbox,一个button,一个label,得到如下:
button的Text 改成GetMessage,然后给click添加事件。
内容如下:
var client = new HelloServiceClient("BasicHttpBinding_IHelloService");
Label1.Text = client.GetMessage(TextBox1.Text);
先构造一个服务的实例,然后调用服务给我们提供的GetMessage方法,运行该网站。
输入内容,点击GetMessage,下面的lebel内容就变成了我们服务返回的结果。
Http调用的介绍完毕,视频还举了第二个winform的例子,和webform的基本一样,就不贴出来了。
我也想知道tcp是怎么调用的,但是视频上没说,今天太迟了,有空再google一下吧。
Thankyou!
年前辞职-WCF入门学习(3)的更多相关文章
- 年前辞职-WCF入门学习(4)
前言 上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题 ...
- 年前辞职-WCF入门学习(1,2)
前言 周一的时候辞职了,离开了从12年毕业后8月份开始一直到现在的公司. 辞职之后当然是玩.玩了若干天的游戏,真的是没日没夜啊,但是玩的太坑,怒删游戏.话说上次玩还是在14年7月份.下次还是过年回家再 ...
- 年前辞职-WCF入门学习(5)
前言 第五集比较简单,视频也只有7分多钟,但是用处还是挺大的.下面我会介绍. 本来想第六集一起介绍的,后来发现第六集内容比较多,有半个多小时,就不一起了.网站规定6小时内只能发布一篇文章到首页,,那我 ...
- 年前辞职-WCF入门(6)
前言 昨天早上去医院做入职体检,被告知要预约,本以为是要排队,我连视频都准备好了...结果就回来了.下午去了新公司那边找房子,2了,因为公司提供了班车列表,我既然就只在班车所经过的几个地方找,却遗漏了 ...
- WCF入门学习2-控制台做为宿主
Step1.创建一个WCF类库和一个控制台程序. Step2.引用WCF项目. Step3.添加这两个引用. //本段代码出处 无废话WCF入门教程系列 Uri baseAddress = new U ...
- 菜鸟级别的WCF入门学习
这两天学习WCF,看了MSDN上的入门教程,和查找了一些网上给的例子,简单的实现了一下,感觉应该很适合我这种菜鸟级的选手看了. 1.新建一个项目--WCF--WCF服务应用程序 用的是MSDN上的加减 ...
- WCF入门学习3-配置文件与部署iis
配置文件设置 --------------------------------------------------- 创建的时候都会有个配置文件,其实有一个WCF配置编辑器,右键就可以点出来设置. 需 ...
- WCF入门学习1-最简单的一次通信
跟着msdn的教程试了一下wcf,真心好用 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.ms ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
随机推荐
- php redis 获取指定前缀的所有key
php redis 获取指定前缀的所有key 以laravel框架为例: $key = $this->redis->keys('db:shipping:shippingId:' . &qu ...
- ubuntu16.04 安装网易云音乐
最爱的播放器 网易云音乐 哈哈,刚刚折腾了双系统,立马开始了软件安装. 网易云音乐从官网下载对应的 64 位版本,我下载的是 netease-cloud-music_1.0.0_amd64_ubunt ...
- python Basic usage
__author__ = 'student' l=[] l=list('yaoxiaohua') print l print l[0:2] l=list('abc') print l*3 l.appe ...
- [转]让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
本文转自:http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html 今天下午17点左右,博客园博客站点出现这样的错误信息: Error S ...
- Ubuntu 14.04 部署 CEPH集群
注:下文的所有操作都在admin节点进行 1.准备三台虚拟机,其中一台作为admin节点,另外两台作为osd节点,并相应地用hostname命令将主机名修改为admin,osd0,osd1,最后修改/ ...
- 《TCP/IP详解 卷一》读书笔记-----UDP&IP 分片
1.进程每产生一个UDP数据报就由一个IP数据报进行发送,而在TCP中,一个IP数据报并不与每个TCP报文段一一对应 2.UDP的端口号和TCP的端口号是相互独立的,对那些众所周知的端口号TCP和UD ...
- Verilog (二) multiplexer and decoder
1 mutiplexer 数据选择器 1) one-bit wide 2-1 mux wire dout = sel? din1 : din0; // conditional continuous ...
- sqlite-jdbc jar包下载过程笔记
在网络上找一些开源的jar包和对应的源码时,官网上往往是最为安全,版本最新.但大部分的网站都为英文网站,有时候定位下载地址稍有困难,下面是网上找sqlite-jdbc jar包过程,记录一下,以供参考 ...
- liunx中的进程与线程
1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作(比如,创建,销毁等)都是有内核来实现的. Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程 ...
- Unity-WIKI 之 AnimationToPNG
组件功能 把3D角色的动画录制成PNG一帧一帧输出,这是一个件多么美好的事! 可能遇到问题 有可能当你新建完脚本时会出现下面的错误: `System.IO.File' does not contain ...