一、创建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[].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[].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(, , );
// 手动调用WCF地址
WcfService.CalculateClient calcTest = new WcfService.CalculateClient(wshttpBinding, endPoint);
// 进行异步操作
calcTest.AddCompleted += new EventHandler<WcfService.AddCompletedEventArgs>(calcTest_AddCompleted);
calcTest.AddAsync(, ); 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(, );
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

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

  1. 如何创建一个简单的struts2程序

    如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...

  2. 使用visualStudio2017创建一个简单的控制台程序

    步骤: 1.  打开visual studio开发工具 2. 选择文件>新建>项目 如下图所示: 3. 选择window金典桌面>控制台应用程序 并填写好想项目名称和选择项目存储地址 ...

  3. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  4. [WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序

    近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列.希望能从中有所收获. 本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅.可能这些问题都很基础,可 ...

  5. 创建一个简单的maven的web程序

    最近学习Hadoop,发现学习要想用hadoop作为后台运行web程序,必须应用maven,所以学习了今天学习了一下maven,然后搭建了一个简单的web程序 首先我使用的是eclipse中自带的ma ...

  6. 在 Visual Studio 中创建一个简单的 C# 控制台应用程序

    转载:https://blog.csdn.net/qq_43994242/article/details/87260824 快速入门:使用 Visual Studio 创建第一个 C# 控制台应用 h ...

  7. 如何创建一个简单的C++同步锁框架(译)

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  8. Android官方教程翻译(3)——创建一个简单的用户界面

    转载请注明出处:http://blog.csdn.net/dawanganban/article/details/9839523 Building a Simple User Interface 创建 ...

  9. 如何在Liferay 7中创建一个简单的JSF Portlet

    这个将在Liferay IDE 3.1 M3的发布版中提供创建的选项,但是你也可以通过命令行来创建. 1.这是Liferay JSF团队的官网:http://liferayfaces.org/ 你能在 ...

随机推荐

  1. Servlet----------ServletConfig

    1. 什么是 ServletConfig servletConfig对象:用于封装servlet的配置信息.从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对servlet自身有效 ...

  2. insert select带来的问题

    当使用 insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定.对于那些从oracle ...

  3. 20170915 linux系统管理培训

    进程管理 程序:通常为二进制程序放在存储媒介中(如光盘.硬盘.软盘.磁带等),以物理文件的形式存在: 进程:正在运行当中的程序,程序被触发后,执行者的权限与属性.程序的程序代码与所有数据等都会被加载到 ...

  4. cxPivotGrid导出数据

    导出数据,需要在uses区域引用cxExportPivotGridLink 根据导出类型使用以下过程 procedure cxExportPivotGridToHTML procedure cxExp ...

  5. 更新合并数组的es6方法

  6. 开发中清除css加载的缓存使用

  7. [Java in NetBeans] Lesson 01. Java Programming Basics

    这个课程的参考视频在youtube. 主要学到的知识点有: Create new project, choose Java Application. one .jar file/ package(.j ...

  8. python-对象与参数传递

    对象与参数传递 python对象 在python中,一切都是对象,变量存储的是对象的引用. 对象可以分为可变对象和不可变对象,可变与不可变是针对对象内容本身而言的. 对象分类 概念 包括 可变对象 对 ...

  9. jquery dataTables例子

    https://datatables.net/examples/styling/bootstrap.html http://datatables.club/example/#styling http: ...

  10. unity3d射线控制移动

    看看效果图 代码: using UnityEngine; using System.Collections; public class T2 : MonoBehaviour { // Use this ...