WCF基础—千里之行始于足下(应用篇)

2024-05-26 07:48

本文主要是介绍WCF基础—千里之行始于足下(应用篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    上一篇我们讲解了一下WCF的理论知识,这次我们来讲解一下WCF的具体应用。我们来讲解两种部署WCF的方式。

  1.      WCF服务如何部署

    Ø  利用配置文件进行部署

    首先我们新建一个解决方案,之后添加一个类库,把接口和以及相关的契约写在类库里面。删除默认的class1,添加一个接口,命名为Interface。因为供其他程序的调用,故而设为public。

    如图:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ServiceModel;
namespace ClassLibrary1
{[ServiceContract]public interface myInterface{[OperationContract]string getServerTime();[OperationContract]DataTable getData();   }
}
</strong></span>

    这样一个服务契约就定好了,接口代表的是一种能力,代表的是一种约定。

    添加一个项目来承载和实现WCF服务,这里我们采用winform应用程序。因为前面的接口只是定义了接口,没有实现,这里我们添加一个类,对服务契约中的接口进行实现,这里需要添加两个引用:前面的契约classLibrary1以及WCF的核心库System.ServiceModel.

如图:

    实现类代码:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace winServer
{public class myClass:ClassLibrary1.myInterface{public string getServerTime(){return DateTime.Now.ToString();}public DataTable getData(){DataTable dt = new DataTable("books");DataColumn dc1 = new DataColumn("书号");DataColumn dc2 = new DataColumn("书名");DataColumn dc3 = new DataColumn("价格");dt.Columns.Add(dc1);dt.Columns.Add(dc2);dt.Columns.Add(dc3);DataRow dr = dt.NewRow();dr["书号"] = "BF1001";dr["书名"] = "WCF高级进阶";dr["价格"] = "30";dt.Rows.Add(dr);return dt;}}
}
</strong></span>

    添加配置文件app.config

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong><?xml version="1.0" encoding="utf-8" ?>
<configuration><system.serviceModel><!--services是不可以省略的,还有bindingy以及behaviors是可以省略的--><services> <service name="winServer.myClass" behaviorConfiguration="testBehavior"><!--name是服务名称,就是我们的类型,就是实现契约接口的类型,behaviorConfiguration是行为的配置--><host><!--基地址--><baseAddresses><add baseAddress="http://localhost:8002/test"/></baseAddresses></host><!--端点的配置地址、绑定以及契约,地址是前面的基地址,一样的时候可以不写,不一样的时候写上--><!--绑定协议可以写成tcp或者http,同基地址对应,contact是契约的名称--><endpoint address="" binding="basicHttpBinding" contract="ClassLibrary1.myInterface"></endpoint></service></services><behaviors><serviceBehaviors><!-- behaviorConfiguration="testBehavior",此时的name是同配置行为挂钩的--><behavior name="testBehavior"><!--允许获得元数据,也就是WCF元数据的描述也即是xml文件--><serviceMetadata httpGetEnabled="true"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
</configuration></strong></span>

    最后我们需要一个winform程序来启动这个程序

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
namespace winServer
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//创建ServiceHost host此对象ServiceHost host = null;private void button1_Click(object sender, EventArgs e){host = new ServiceHost(typeof(winServer.myClass));//承载服务的一个实例,服务有这个类来实现的host.Open();label1.Text = "服务已启动!";}}
}
</strong></span>

    服务发布到基地址上,我们可以把基地址输入到浏览器地址栏中,可以看到相应的结果

    我们可以创建客户端对这个程序进行调用

    调用顺序是添加引用:


    此时弹出添加服务引用的窗体,如下图所示:


    此时在地址中输入我们配置的基地址或者在发现中找寻服务即可,添加进去即可。

    Ø  利用代码部署服务

    在前一个实例的基础上,创建一个winform窗体,同样添加一个实现契约的具体类,同前者一样,之后在变成窗体程序,在窗体上添加两个按钮,一个是开启,一个停止。

这里不再是通过配置文件来部署WCF服务而是通过代码来实现。

winform程序如图:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
namespace winServer2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//此处需要ServiceHost host对这个对象承载这个服务ServiceHost host = null;//启动private void button1_Click(object sender, EventArgs e){host = new ServiceHost(typeof(winServer2.myClass));//承载的具体服务(类,实现接口的具体类)NetTcpBinding tcpBind = new NetTcpBinding();//创建一种绑定形式string address = "net.tcp://localhost:3200/hello"; //自定义一个地址,根据上面的类型决定协议的类型,端口以及路径(随便取的)host.AddServiceEndpoint(typeof(ClassLibrary1.myInterface), tcpBind, address);//添加服务的端点,包括三部分契约、绑定和地址host.Opened += delegate { label1.Text = "服务已启动!"; };//定义的一个委托host.Open();}//停止private void button2_Click(object sender, EventArgs e){if (host.State != CommunicationState.Closed){host.Close();label1.Text = "服务已停止!";}}}
}
</strong></span>

    之后我们可以创建客户端程序对这个服务进行调用,我们创建一个winform窗体,名为client,不是像上面的添加引用来实现,而是通过编写纯代码的形式实现,如下图:

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;using System.ServiceModel;
namespace client
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//getServerTimeprivate void button1_Click(object sender, EventArgs e){//绑定形式NetTcpBinding bind = new NetTcpBinding();//绑定的协议类型,创建绑定形式//地址EndpointAddress address = new EndpointAddress("net.tcp://localhost:3200/hello");//发布服务的地址//通道工厂ChannelFactory<ClassLibrary1.myInterface> factory = new ChannelFactory<ClassLibrary1.myInterface>(bind,address);//通道工厂生成的类型ClassLibrary1.myInterface myobject = factory.CreateChannel();//通过这个工厂可以创建通道,也即是获得这个对象,对象的类型是interfacestring time = myobject.getServerTime();//也就是可以获得相应的方法和实现MessageBox.Show(time);}private void button2_Click(object sender, EventArgs e){//绑定形式NetTcpBinding bind = new NetTcpBinding();//地址EndpointAddress address = new EndpointAddress("net.tcp://localhost:3200/hello");//通道工厂ChannelFactory<ClassLibrary1.myInterface> factory = new ChannelFactory<ClassLibrary1.myInterface>(bind, address);ClassLibrary1.myInterface myobject = factory.CreateChannel();dataGridView1.DataSource = myobject.getData();}}
}
</strong></span>

  2.      总结

    上面这两种方式都是WCF的宿主都是winform窗体,其他的形式大家可以自己去尝试。


这篇关于WCF基础—千里之行始于足下(应用篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003864

相关文章

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

JavaScript装饰器从基础到实战教程

《JavaScript装饰器从基础到实战教程》装饰器是js中一种声明式语法特性,用于在不修改原始代码的情况下,动态扩展类、方法、属性或参数的行为,本文将从基础概念入手,逐步讲解装饰器的类型、用法、进阶... 目录一、装饰器基础概念1.1 什么是装饰器?1.2 装饰器的语法1.3 装饰器的执行时机二、装饰器的

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事