上一次提到,我们的WCF程序宿主是发布到IIS上面的。虽然这样做未尝不可,不过不便于我们进行“开始”或“停止”WCF服务的操作。所以再次尝试了编写以窗体应用程序作为WCF服务宿主的方式,并取得了成功。而下文则记录整个程序的建立过程。

一、创建WCF服务

首先创建一个WCF服务项目,项目名称为WCFService,解决方案为WCFDemo。

新建的WCF服务项目已经包含了一个GetData()函数,我们这个例子中直接使用这个函数。

二、创建WCF宿主

同样地,我们为这个解决方案增加一个WCF服务宿主项目。项目名称为WCFServerHost,程序类型为Windows窗体应用程序。

在程序的窗口上放置一个按钮,并将按钮的标题改为“开启服务”,修改后的窗口如下:

然后为程序添加System.ServiceModel和WcfService两个引用

最后,双击程序按钮添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private ServiceHost Host = null;
private void button1_Click(object sender, EventArgs e)
{
    if (Host == null)
    {
        Host = new ServiceHost(typeof(WCFService.Service1));
 
        //绑定
        System.ServiceModel.Channels.Binding httpBinding = new BasicHttpBinding();
        //终结点
        Host.AddServiceEndpoint(typeof(WCFService.IService1), httpBinding, "http://localhost:8002/");
        if (Host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
        {
            //行为
            ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
            behavior.HttpGetEnabled = true;
 
            //元数据地址
            behavior.HttpGetUrl = new Uri("http://localhost:8002/Service1");
            Host.Description.Behaviors.Add(behavior);
             
            //启动
            Host.Open();
        }
    }
}

然后,在关闭窗口事件中添加如下代码:

1
2
3
4
5
6
7
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    if (Host != null)
    {
        Host.Close();
    }
}

好了,现在运行应用程序,开启服务后,在IE浏览器中输入http://localhost:8002/Service1,检查是否正常显示元数据。

三、编写客户端程序

在解决方案中再添加一个新的Windows窗体应用程序,程序名称为WCFClient。

然后,在关闭窗口事件中添加如下代码:在程序项目上按右键,选择“添加服务引用……”。在添加服务引用对话框的地址栏位中,输入:http://localhost:8002/Service1,发现服务后,将服务命名空间改为ServiceReferenceDemo,然后点击“确定”按钮。

添加完服务后,我们在程序窗口上放置一个按钮,并将按钮标题命名为“执行”。双击“执行”按钮,并编写如下代码:

1
2
3
4
5
6
7
8
9
private void button1_Click(object sender, EventArgs e)
{
    using (ServiceReferenceDemo.Service1Client sc = new ServiceReferenceDemo.Service1Client())
    {
        sc.Open();
        MessageBox.Show(sc.GetData(10));
        sc.Close();
    }
}

四、测试执行

首先确保Host程序已经运行、然后执行客户端程序,并点击“执行”按钮,检查是否有一个正确的返回值。

C# WCF 完整实例,winform 窗体作为 宿主的更多相关文章

  1. WCF小实例以及三种宿主

    WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...

  2. 使用C#创建及调用WCF完整实例 (Windows服务宿主)

    关于WCF的概念.原理.优缺点等,在这里就不多说了,网上很多,可以自行搜索,比我解释的要专业的多. 这里直接说使用Windows 服务(Windows Service)作为宿主如何实现,其它方式不在此 ...

  3. 转:C# WinForm窗体及其控件的自适应

    一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率>  ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...

  4. C# WinForm窗体及其控件自适应各种屏幕分辨率

    C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明  我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置 ...

  5. 观察者模式的应用:Winform窗体之间传值

    观察者模式的应用:Winform窗体传值 观察者模式的概念: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并更新. 今天我们就学着用一下这个观察者模式,先想象 ...

  6. Winform窗体实现简单的二维码生成和保存

    二维码的生成需要用到二维码生成的类库,ThoughtWorks.QRCode.dll 步骤: 第一步:下载二维码生成类库,ThoughtWorks.QRCode.dll 第二步:新建winform项目 ...

  7. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  8. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...

  9. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

随机推荐

  1. 基于spring-boot的应用程序的单元测试方案

    概述 本文主要介绍如何对基于spring-boot的web应用编写单元测试.集成测试的代码. 此类应用的架构图一般如下所示: 我们项目的程序,对应到上图中的web应用部分.这部分一般分为Control ...

  2. ROT13 加密与解密

    ROT13简介: ROT13(回转13位)是一种简易的替换式密码算法.它是一种在英文网络论坛用作隐藏八卦.妙句.谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥.ROT13 也是过去在古罗 ...

  3. CentOS7中热插拔硬盘如何读取新的硬盘

    在服务器或虚拟机上,一般会实现热插拔硬盘.此时CentOS7是无法读到新盘的,所以需要重新扫描. 我们添加一个新的硬盘演示: [root@xuexi ~]# ls /dev/sd* //应该还有一个s ...

  4. 【Memory】chrome调试面板

    本篇文章以chrome版本67.0.3396.99为例,介绍如何使用Chrome和DevTools查找影响页面性能的内存问题,包括内存泄漏.内存膨胀和频繁的垃圾回收. 一.参考链接 https://d ...

  5. ELK收集openstack日志

    1.安装jdk 每个openstack服务器需要安装jdk,我安装的版本jdk-7u71-linux-x64.rpm 2.安装.配置Elastic Search install https://dow ...

  6. collection 和 collections

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha collection 是集合的意思. 集合 是 集合类的上级接口, 比如 set 和 l ...

  7. POJ 1469 COURSES 二分图最大匹配 二分图

    http://poj.org/problem?id=1469 这道题我绝壁写过但是以前没有mark过二分图最大匹配的代码mark一下. 匈牙利 O(mn) #include<cstdio> ...

  8. 方程式0day图形化利用工具

    最近方程式的漏洞着实活了一把,分析了下githup上面的文件目录,找到了利用文件,主要是针对windows主机的SMB.RDP协议进行攻击,因为我主要根据他们提供的payload的程序,利用这两个模块 ...

  9. python开发_platform_获取操作系统详细信息工具

    ''' python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获取操作系统名称及版本号,'Win ...

  10. Codeforces Round #281 (Div. 2) C. Vasya and Basketball 暴力水题

    C. Vasya and Basketball time limit per test 2 seconds memory limit per test 256 megabytes input stan ...