您好,登录后才能下订单哦!
WCF入门将和大家一起探讨以下内容:
①WCF的基础知识,快速创建一个WCF应用程序。
②WCF契约
③WCF服务部署的实现
④WCF的通信模式
⑤WCF的调用模式
这一节,我们了解WCF的基础知识。
WCF就是一种面向SOA的技术,是用来构建面向服务的应用程序框架,是微软开发的一组数据通信应用程序开发接口,可以在不同的组件、应用程序、系统之间进行通信。服务和被调用之间是一种松散的关系。服务是被动的,当对服务的请求传入时,服务才会被调用。
这里有必要说下SOA(Service-Oriented-Architecture)面向服务的架构,主要是为了解决在Internet环境下通过连接完成特定任务的独立功能实体实现业务集成的需求的一种软件系统架构。可以将SOA理解成为一个组件模型,它将应用程序间不同的服务通过服务间定义好的接口和契约将它们组合起来。WCF可以实现多平台、多协议、安全可靠、高效率的系统间的通信,只要这些系统都支持SOAP就能实现互操作。可以说WCF提供了统一的、建立安全、可靠、面向服务的高效开发平台,同时WCF还向后兼容WebService。
WCF可以看做是.net平台下一组服务的集合,WCF集成了ASMX(Active Server Mehtod)、WSE(Web Services Enhancements)、Remoting、Enterprise Service、MSMQ所有的功能并进行了良好的封装,减轻了开发人员的开发难度和学习成本。开发人员不用在担心安全、跨平台、服务集成、消息传输的多个难题。
学习WCF需要具备编程基础,尤其是对接口的理解,其实不仅是WCF,可以说接口是面向对象思想的核心。面向对象的实质可以看做是对现实的抽象,接口正式抽象的体现,CLR对此有深刻的反应,如果熟悉IL代码的人都是interface在编译成IL代码是会被编译成interface [访问修饰符] abstract 这就是为什么在接口不能添加abstract修饰的原因,扯远了。
我在文中提到了SOAP,SOAP(Sample Ojbect Access Protocol)简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。说的了XML我想多说几句,XML在.NET平台中应用可以说无处不在如元数据的表示、系统的配置、持久化、数据交换等等,XML具有可阅读性强、定义灵活、储存便捷的特点,但是在现在很多系统中尤其是移动终端开发的数据交换却不喜欢用它,鄙人也是这样,因为XML和另一种具有同种功能的轻量级数据交换格式相比体积庞大的多,有兴趣的可以研究下。
另外稳重我会还提到了WebService,这个是提供Web服务调用最为人所熟知的技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。不限制语言、 平台或内部协议, 都可以相互交换数据只要是支持SOAP就行,但是在安全性方面不是太好,当然这也只是针对安全性需求而言的,对应提供公共服务信息的服务比如天气、新闻等等WebService是再适合不过了。
最后,要介绍下WCF的通信的模式以WCF应用层的组成,WCF是来实现现实应用中通信的要求,当然它也必须支持三种通信模式,即:
单工:就是通信只能想一个方向进行的通信模式,比如说广播、卫星等,WCF我们称之为单工模式。
半双工:就是通信可以在两个方向都进行,但是在同一时刻一方只能接收或者发送消息,比如对讲机,当在WCF这个名称有些不一样,我们称它为请求响应模式。
全双工:也即是我们所说的两个方向都能进行传输,并且两个方向都能同时进行传输。在WCF我们称之为异步模式。
WCF有客户端和服务器,组成,当然则个服务器和客户端是相对的,这个在我们后面的学习中会有所体会。
了解了WCF有关的基础知识,我们还是来建议一个WCF的应用程序吧。
使用VS创建一个WCF的应用型如此的简单,让我们对WCF是否感觉到并没什么难度,说实话,入门不难但是要开发出适合企业级应用远非如此,在我所经历的项目中应用WCF满足不了器性能要求,我们最终不得不使用Apache的ActiveMQ来实现我们电文传输,如果有时间我愿意分享这些经验。
第一步,新建一个WCF项目“WcfProgress”
添加“WCF应用程序”并取名“WcfProgress”
这是我们会看到几个文件IService1.cs,这个名字以及接口可以使用重构修改成你想要的名称,这文件就是我们说说的服务契约,其实接口本身就是一种契约。在契约中添加我们我喜欢实现的方法、属性、数据成员等就指定好了一个契约。我在这里将接口和实现类重新命名了。
双击接口文件我们可以看到以下内容
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IGetSystemInfo”。
[ServiceContract]
publicinterfaceIGetSystemInfo
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: 在此添加您的服务操作
}
// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract]
public class CompositeType
{
bool bool Value = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
这里需要说明的是,[ServiceContract][OperationContract] [DataContract][DataMember]这些属性标签之所以可以正常使用,得益于System.ServiceModel处理类,所以用手动创建WCF应用类库的时候我们一定不要我拿过来添加对其的应用。ServiceContract:叫做服务契约,表示这个接口是一个服务契约,IDE和编译真是通过他来生成响应服务的。OperationContract说白了就是调用远程方法。DataContract这是对其中中数据的定义。DataMember这是对其契中数据结构中属性的定义。
我在其中添加了一个GetSystemTime的操作契约,那么响应的应该在实现类中添加对操作契约的具体实现。
[ServiceContract]
public interface IGetSystemInfo
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
[OperationContract]
string GetSystemTime();
}
public class GetSystemInfo : IGetSystemInfo
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
public string GetSystemTime()
{
return System.DateTime.Now.ToString("yyyy-M-d dddd");
}
}
第二步,我们的服务端程序基本就完成了,接下来我们建立一个客服端来调用它吧。这里我们为了后面演示异步就用Winform程序了。建立一个WcfClient项目。
第三步,在客户端添加对服务的引用。
注意如果要生成异步操作的话可以点“高级”进入“服务引用设置”勾选“生成异步操作”。
好了然后在FrmClient的call Server按钮事件中填写如下代码:
private void btn_CallGetSysTime_Click(object sender, EventArgs e)
{
GetSystemServer.GetSystemInfoClient client = newGetSystemInfoClient();
MessageBox.Show(client.GetSystemTime());
}
现在我们把启动服务,并允许窗体,查看结果。
首先,后台启动后会打开浏览器并显示服务调用页面的信息,如下图所示:
客户端则显示如下,至此一个简单的WCF程序就完成了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。