当前位置: 首页 > news >正文

WCF学习总结

1. WCF简介

    WCF (Windows Communication Foundation)是由微软发展的一组数据通信的应用程序开发借口。WCF由服务地址(Address) 、协议绑定 (Binding)和 契约(Contract)三部分组成,既“ABC”。

2. 为什么用WCF

    WCF既支持具有互操作性的Web服务,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持,同时在安全性上,它完全遵循了WS-*的标准,此外,它还支持队列服务,可以非常方便地利用消息队列完成异步操作与脱机调用。

 

特性

Web Service

.NET Remoting

Enterprise Services

WSE

MSMQ

WCF

具有互操作性的Web服务

支持

 

 

 

 

支持

.NET到.NET的通信

 

支持

 

 

 

支持

分布式事务

 

 

支持

 

 

支持

支持WS标准

 

 

 

支持

 

支持

消息队列

 

 

 

 

支持

支持

WCF引入了用通道,它封装了消息的通信细节,例如编码、事务处理、安全等,然后又通过引入绑定的概念,封装了通道的组成顺序与处理细节。最后,引入了独有的Endpoint元素,集成了地址、绑定和契约之间的“三位一体”,以最简单的方式定义和发布服务。

 

3. Web Service 的两种使用方式:  

    1. 直接在VS 环境中创建WebService服务

       在创建的项目下,会生成一个IService.cs借口文件和Service.svc服务文件,在IService.cs文件中可以加入自己需要的方法签名。然后Service.svc服务文件实现了IService借口中的方法,之后你运行此项目,将会生成一个URL地址既服务地址:如http://localhost:47948/Service1.svc,复制这个地址,然后创建一个客户端应用程序,如windows forms或者控制台应用程序都行,创建好之后在Reference上右击添加Web服务,将此地址粘贴。然后再客户端的代码中写如下代码调用Server端的方法:

ServiceClient sc=new  ServiceClient();

sc.GetData();

sc.Close();

这样就可以实现WCF最简单的使用。

     2. 用SVCUtil.exe 编译服务地址

     在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 此目录下有SvcUtil.exe 这个编译命令,她会将服务地址编译成一个.cs文件和一个.config配置文件。这样之后将这两个文件拷贝到客户端的项目中,使用上面的调用方法也可以得到相同的作用。

运行cmd命令,输入:CD C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 再输入: SvcUtil.exe http://localhost:47948/Service1.svc -language:C# -out:C:\WebTest\User.cs -config:C:\WebTest\User.config 回车,他就会在C:\WebTest下面生成User.cs和User.config文件。(注:User.config文件拷贝到项目中之后需要重命名为app.config或者 Web.config)。客户端调用代码同上。

4. 自己写code配置服务的两种方法

    1. 自己写App.config配置服务信息

    代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WinServiceTest.Test" behaviorConfiguration ="testBehavior">
<host>
<baseAddresses>
<add baseAddress ="http://localhost:8080/test"/>
</baseAddresses>
</host>
<endpoint address ="" binding="basicHttpBinding" contract ="Service.IService" >
</endpoint>
</service>
</services>
<behaviors >
<serviceBehaviors >
<behavior name="testBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>

</behaviors>
</system.serviceModel>
</configuration>

        然后在客户端 写如下代码host起服务器:

ServiceHost host = null;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WinServiceTest.Test));
host.Open();
label1.Text = "服务已经启动";
}

      注:WinServiceTest.Test 是当前项目中的一个累,继承了Server端的借口类,并实现了他的方法。当这个服务启动起来之后,我们可以检测他到底是不是启动起来了,我们可以用浏览器打开上面写得那个baseAddress中的地址进行确定,如果打开像WebService中的那样,那就证明我们启动起来了,如果出现错误,估计就配对不对。

      在启动服务有可能会报这个错误:"HTTP 无法注册 URL http://+:8080/test/。进程不具有此命名空间的访问权限“,处理这个错误的方法是关闭VS,然后用管理员身份运行VS就可以了。

在创建一个客户端去调用服务端的方法有两种,第一种就是用添加Web服务引用的方式将baseAddress中的服务地址添加进去,然后通过ServiceClient去访问。

第二种还是用代码去访问,代码如下:

//地址
EndpointAddress a = new EndpointAddress("http://localhost:8080/test");
//绑定
BasicHttpBinding btb = new BasicHttpBinding();
//通道工厂
ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
Service.IService sis = cf.CreateChannel();
int t = sis.Add(3, 5);
MessageBox.Show(t.ToString());

这样就可以实现自己配置服务器,自己去host服务器,然后调用方法。

     2. 用Code 配置服务器 host起服务器

     代码如下:

ServiceHost host = null;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WinTest.Test));
NetTcpBinding tcp=new NetTcpBinding ();
string a = "net.tcp://localhost/test";
host.AddServiceEndpoint(typeof(Service.IService), tcp, a);
host.Opened += delegate { label1.Text = "服务已经启动!"; };
host.Open();
}

private void button2_Click(object sender, EventArgs e)
{
if (host.State == CommunicationState.Opened)
host.Close();
label1.Text = "服务已经关闭";
}

然后同上创建一个客户端去调用服务器端的方法:

//地址
EndpointAddress a = new EndpointAddress("net.tcp://localhost:8080/test");
//绑定
NetTcpBinding btb = new NetTcpBinding();
//通道工厂
ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
Service.IService sis = cf.CreateChannel();
int t= sis.Add(3, 5);
MessageBox.Show(t.ToString());

4. 总结

  上面是简单的WCF的四种应用,WCF在如今的大多数项目应用很广泛。

   除过上面的简单例子,我们还可以用一下网上公布的服务地址如天气预报服务地址,号码归属地查询等一些WebService服务,用法就是将这些服务添加到自己的项目中,然后通过对应的ServiceClient 去调用。

 

转载于:https://www.cnblogs.com/baoyi/p/WCFStudy.html

相关文章:

  • javascript模拟鸟群使用cax和threejs渲染引擎
  • 18-07-31
  • Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题...
  • QM课程03-采购中的质量管理
  • win7 wamp 64位 php环境如何开启curl服务?
  • ZOJ3765 Lights Splay树
  • 4个实用的微服务测试策略
  • float,double和decimal类型
  • iOS:高仿闲鱼、京东等列表底部分页视图
  • 使用MDI 和 XtraTabbedMdiManager 后 选项卡切换后Ribbon 合并后不选中MDI子窗...
  • java~springboot~ibatis Invalid bound statement (not found)原因
  • c#正则表达式
  • 解码 | 25 分钟开发分布式架构的转账小程序
  • 删除2018年以前的文件
  • UTF-8编码规则
  • 【5+】跨webview多页面 触发事件(二)
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JS专题之继承
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • quasar-framework cnodejs社区
  • React-Native - 收藏集 - 掘金
  • Spring框架之我见(三)——IOC、AOP
  • Terraform入门 - 1. 安装Terraform
  • VuePress 静态网站生成
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Yii源码解读-服务定位器(Service Locator)
  • 初识MongoDB分片
  • 从重复到重用
  • 聊聊hikari连接池的leakDetectionThreshold
  • 码农张的Bug人生 - 见面之礼
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 原生 js 实现移动端 Touch 滑动反弹
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云ACE认证学习知识点梳理
  • #14vue3生成表单并跳转到外部地址的方式
  • #includecmath
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)求1到1亿间的质数或素数
  • (译)计算距离、方位和更多经纬度之间的点
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net Stream篇(六)
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET下ASPX编程的几个小问题
  • .net下简单快捷的数值高低位切换
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [Codeforces] probabilities (R1600) Part.1
  • [codevs] 1029 遍历问题
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [LOJ 6213]「美团 CodeM 决赛」radar
  • [Redis]Redis的数据类型