一、创建WCF服务器

1、创建WCF服务器的窗体应用程序

打开VS2010,选择文件→新建→项目菜单项,在打开的新建项目对话框中,依次选择Visual C#→Windows→Windows窗体应用程序,然后输入项目名称(Name),存放位置(Location)和解决方案名称(Solution Name),点击“确定”生成项目。如下图:

2、在新建的WcfServer项目中右键添加→新建项,新建一个Calculate的WCF服务,接着添加服务操作,本示例中添加了一个Add的加法服务操作

Add的加法服务操作代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;namespace WcfServer
{// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ICalculate”。
    [ServiceContract]public interface ICalculate{[OperationContract]int Add(int i, int j);}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;namespace WcfServer
{// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Calculate”。public class Calculate : ICalculate{public int Add(int i, int j){return i + j;}}
}

3、将该项目中创建的Form1重命名为FrmMain,在窗体中进行WCF服务的操作,如下图:

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;
using System.Configuration;
using System.ServiceModel.Configuration;namespace WcfServer
{public partial class FrmMain : Form{public FrmMain(){InitializeComponent();txtWcfServiceURL.Text = ConfigHelper.Config.WcfServiceConnectURL;}/// <summary>/// 主机服务/// </summary>
        ServiceHost serviceHost;/// <summary>/// 开启服务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){ConfigHelper.Config.WcfServiceConnectURL = txtWcfServiceURL.Text;if (serviceHost == null){this.btnStart.Enabled = false;this.btnStop.Enabled = true;try{// 实例化WCF服务对象serviceHost = new ServiceHost(typeof(WcfServer.Calculate));serviceHost.Opened += delegate { MessageBox.Show("启动服务OK"); };serviceHost.Closed += delegate { MessageBox.Show("停止服务OK"); };serviceHost.Open();}catch (Exception ex){MessageBox.Show("启动服务异常:" + ex.Message + "==>" + ex.StackTrace);}}else{btnStop_Click(sender, e);}}/// <summary>/// 停止服务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStop_Click(object sender, EventArgs e){this.btnStart.Enabled = true;this.btnStop.Enabled = false;try{if (serviceHost != null){serviceHost.Close();serviceHost = null;}}catch (Exception ex){MessageBox.Show("停止服务异常:" + ex.Message + "==>" + ex.StackTrace);}}}public class ConfigHelper{private static ConfigHelper _config = new ConfigHelper();/// <summary>/// 获取ServerConfig对象/// </summary>public static ConfigHelper Config{get { return _config; }}/// <summary>/// 获取或设置连接服务器地址/// </summary>public string WcfServiceConnectURL{get { return GetWcfServiceUri(); }set { SetWcfServiceUri(value); }}/// <summary>/// 设置Wcf服务器的地址/// </summary>private void SetWcfServiceUri(string uri){Configuration serviceModelConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);ConfigurationSectionGroup serviceModel = serviceModelConfig.SectionGroups["system.serviceModel"];ServiceModelSectionGroup serviceModelSectionGroup = serviceModel as ServiceModelSectionGroup;ServiceElement service = serviceModelSectionGroup.Services.Services["WcfServer.Calculate"];service.Host.BaseAddresses[0].BaseAddress = uri;serviceModelConfig.Save();// 刷新命名节,在下次检索它时将从磁盘重新读取它。记住应用程序要刷新节点//ConfigurationManager.RefreshSection("system.serviceModel");ConfigurationManager.RefreshSection("system.serviceModel/behaviors");ConfigurationManager.RefreshSection("system.serviceModel/bindings");ConfigurationManager.RefreshSection("system.serviceModel/client");ConfigurationManager.RefreshSection("system.serviceModel/services");}/// <summary>/// 获取Wcf服务器的地址/// </summary>/// <returns></returns>private string GetWcfServiceUri(){Configuration serviceModelConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);ConfigurationSectionGroup serviceModel = serviceModelConfig.SectionGroups["system.serviceModel"];ServiceModelSectionGroup serviceModelSectionGroup = serviceModel as ServiceModelSectionGroup;ServiceElement service = serviceModelSectionGroup.Services.Services["WcfServer.Calculate"];return service.Host.BaseAddresses[0].BaseAddress;}/// <summary>/// 设置指定节点的配置值/// </summary>private void SetAppSettings(string key, string value){Configuration appSettingConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);appSettingConfig.AppSettings.Settings[key].Value = value;appSettingConfig.Save();ConfigurationManager.RefreshSection("appSettings");// 刷新命名节,在下次检索它时将从磁盘重新读取它。记住应用程序要刷新节点
        }/// <summary>/// 获取指定节点的配置值/// </summary>private string GetAppSettings(string key){return ConfigurationManager.AppSettings[key];}}
}

这样WCF服务器基本上就做好了,接下来就是在WCF客户端调用了!

二、WCF客户端

1、新建的控制台程序项目WcfClient,右键添加服务引用,弹出添加服务引用对话框,点击前往,在地址上输入WCF服务器的地址,找到服务后,修改命名空间,点击确定,项目自动生成服务。如下图:

2、客户端(控制台应用程序)中调用WCF服务操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;namespace WcfClient
{class Program{// 要想异步调用,需要在添加服务引用时,选择“高级”按钮→勾选“生成异步操作”static void Main(string[] args){EndpointAddress endPoint = new EndpointAddress("http://192.168.8.184/Calculate");// 基于WSHttp请求方式Binding wshttpBinding = new WSHttpBinding();wshttpBinding.SendTimeout = new System.TimeSpan(0, 1, 0);// 手动调用WCF地址WcfService.CalculateClient calcTest = new WcfService.CalculateClient(wshttpBinding, endPoint);// 进行异步操作calcTest.AddCompleted += new EventHandler<WcfService.AddCompletedEventArgs>(calcTest_AddCompleted);calcTest.AddAsync(12, 21);Console.ReadKey();}/// <summary>/// 调用AddAsync方法完成后回调事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>static void calcTest_AddCompleted(object sender, WcfService.AddCompletedEventArgs e){Console.WriteLine(e.Result);}}
}

使用ChannelFactory类动态调用WCF地址:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;namespace WcfClient
{class Program{static void Main(string[] args){WcfService.ICalculate icalcTest = null;try{EndpointAddress endPoint = new EndpointAddress("http://192.168.8.184/Calculate");// 基于WSHttp请求方式Binding wshttpBinding = new WSHttpBinding();//using (ChannelFactory<WcfService.ICalculate> channelFactory = new ChannelFactory<WcfService.ICalculate>("ClientEndpoint", endPoint))using (ChannelFactory<WcfService.ICalculate> channelFactory = new ChannelFactory<WcfService.ICalculate>(wshttpBinding, endPoint)){icalcTest = channelFactory.CreateChannel();   // 建立连接通道(icalcTest as ICommunicationObject).Closed += delegate{Console.WriteLine("连接已关闭");};int addResult = icalcTest.Add(12, 21);Console.WriteLine(addResult);}}catch (TimeoutException){(icalcTest as ICommunicationObject).Abort();}catch (CommunicationException){(icalcTest as ICommunicationObject).Abort();}catch (Exception){(icalcTest as ICommunicationObject).Close();}Console.ReadKey();}}
}

本示例的源码:http://files.cnblogs.com/lusunqing/WcfTest.rar

转载于:https://www.cnblogs.com/lusunqing/p/3398684.html

创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址相关推荐

  1. 使用timer控件创建一个简单的报警程序

    简介: 当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了"一会儿"去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来 ...

  2. 创建一个简单的应用程序窗口,显示“欲穷千里目 更上一层楼”。这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红、绿、黄、蓝,四种字体分别为宋体、楷

    创建一个简单的应用程序窗口,显示"欲穷千里目 更上一层楼".这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红.绿.黄.蓝,四 ...

  3. 练习1:创建一个简单的银行程序包

    练习目标-Java 语言中面向对象的封装性及构造器的使用. 任务 在这个练习里,创建一个简单版本的(账户类)Account类.将这个源文件放入banking程序包中.在创建单个帐户的默认程序包中,已编 ...

  4. DIRECTDRAW 1:创建一个简单的DIRECTDRAW程序

    步骤 1: 创建一个 DirectDraw 对象 要创建一个 DirectDraw 对象的实例,你的应用程序要象 DDEx1 例程中的 doInit 函数那样先使用 DirectDrawCreate ...

  5. 开启关闭oracle数据库,手动开启/关闭Oracle数据库

    @echo off @echo 启动/关闭数据库 set /p flag=您是否要启动数据库?(是按Y启动,否按N关闭) goto answer%flag% goto end :answery ech ...

  6. Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序

    参考:https://www.cnblogs.com/jliangqiu2016/p/7642471.html Windows下编译TensorFlow1.3 C++ library及创建一个简单的T ...

  7. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · 创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS, ...

  8. Revit二次开发入门--创建一个简单的程序

    创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS,我的版本是VS2015,点击[新建项目]→[Visual C#]→[类库],然后输入程序名称,如:Hello ...

  9. C#.net创建一个简单的消息队列程序(MessageQueue)

    MessageQueue:消息队列,现在应用也是越来越广泛,如微信朋友圈,可以概括为仅仅两条消息队列,消息队列常用于处理高并发的问题,当我们在实际应用中发现接收到数据量过多时,可以使用队列. 微软提供 ...

  10. C# 创建、部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。 概念性的东西就不说太多,下面开始创建一个简单的webservi

    C# 创建.部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice ...

最新文章

  1. 广州富力再引强援 95后潜力中锋桂宏加盟球队
  2. django 与 百度 ueditor 富文本编辑器集成
  3. sql server 2008 r2 没有维护计划_坚果R2发布,骁龙865+1亿像素+90Hz,4499元起
  4. NSNotification、delegate和KVO的区别
  5. 从流程的自动化中获得最大价值的10种方式
  6. CSS3转换之移位translate(CSS3)
  7. php thread 例子,php多线程thread开发与应用的例子
  8. Spark内核解析之一:内核概述
  9. Linux之YUM方式安装SVN
  10. laravel傻瓜手册6(模型)
  11. Django教程 —— 站点后台管理
  12. 怎样进入金蝶服务器修改参数,金蝶KIS专业版启用后如何后台修改系统参数
  13. ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类
  14. 股票分析之融资买入分析
  15. 记录一次app崩溃信息调试
  16. 7.腾讯微博Android客户端开发——自动获取验证码(1)
  17. c语言scanf_s函数详解,scanf_s()函数
  18. VS源文件提取工具vsjuicer 实现细节
  19. 基于Java的建筑工程综合管理信息系统
  20. 【FFmpeg】pkt->duration = 0, maybe the hls segment duration will not precise

热门文章

  1. Factory Method (工厂方法)
  2. php操作mysql常用_PHP常用MySql操作
  3. python环境下数据操作_在windows环境下使用Python操作spatialite数据库
  4. python 移动平均线_如何使用NumPy计算移动平均线?
  5. ajax 关闭弹窗并跳转到url_Python 爬虫 | Ajax数据爬取
  6. java找出两个共有,Java-找出两个单链表的首个公共节点
  7. mysql双机备份最简单_简单实现MySQL数据库双机热备份的方案
  8. sh文件在linux下如何运行_RTMP协议安防视频平台EasyDSS在Linux系统下运行报错,如何处理?_...
  9. 3项目里面全局用less变量 cli vue_Vue.js构建工具比较
  10. java 静态库和动态库_Android下Java的静态库和动态库