WCF 学习总结1 -- 简单实例

从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单,方便,快捷。

(上图选自《Programming WCF Services》)

WCF基本概念(ABC): 1.地址(Address):决定服务的地址;2.绑定(Binding):决定服务的细节;3.契约(Contract):服务的定义(抽象),决定消息结构的定义。

WCF的发布:WCF服务的发布可以有几种形式: IIS, Windows Service, Self-Host(可以是Console程序也可以是Winform程序)。

WCF的工具: Windows Communication Foundation 工具


简单实例-1: 内置AppDomain (无配置)

1. Service1.cs

namespace WCFStudy1  
{  
    [ServiceContract]  
 public interface IService1  
    {  
        [OperationContract]  
 string SendMessage(string clientInput);  
    }  
 public class Service1 : IService1  
    {  
        #region IService1 Members 
 public string SendMessage(string clientInput)  
        {  
 return string.Format("Server Get Message: {0}", clientInput);  
        }  
        #endregion 
    }  
}  

2. Program.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.ServiceModel;  
namespace WCFStudy1  
{  
 class Program  
    {  
 static void Main(string[] args)  
        {  
 // 创建一个独立AppDomain作为服务端。 
            AppDomain.CreateDomain("Server1").DoCallBack(delegate 
            {  
                ServiceHost host = new ServiceHost(typeof(Service1));  
                host.AddServiceEndpoint(typeof(IService1),                  //契约(C) 
 new BasicHttpBinding(),             //绑定(B) 
 "http://localhost:9999/myservice"); //地址(A)  
                host.Open();  
            });  
 // 下面是客户端 
            ChannelFactory<IService1> factory = new ChannelFactory<IService1>(  
 new BasicHttpBinding(),  
 "http://localhost:9999/myservice");  
            IService1 client = factory.CreateChannel();  
            var reply = client.SendMessage("Hello WCF");  
            Console.WriteLine(reply);  
            Console.Read();  
        }  
    }  
}  

如图所示:


简单实例-2: 创建 Console Self-Host

WcfServiceLib - 服务契约的实现; *ConsoleHost工程 – Wcf宿主; *ConsoleClient工程 - Wcf客户端

  1. 创建WcfServiceLib工程(选WCF Service Library工程模板: VS为我们自动添加一个IService1.cs和Service1.cs)

  1. Host工程里引用WcfServiceLib工程
  1. 将WcfServiceLib里App.config移动到ConsoleHost工程里,删掉Lib工程里的App.config
  1. Host工程的Program.cs添加下面的代码,右击Builder工程
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.ServiceModel;  
using WcfServiceLib;  
namespace WCFStudy2ConsoleHost  
{  
 class Program  
    {  
 static void Main(string[] args)  
        {  
 using(var host = new ServiceHost(typeof(Service1)))  
            {  
                host.Open();  
                Console.WriteLine("Service start.");  
                Console.Read();  
            }  
        }  
    }  
}  
  1. 运行 ConsoleHost工程 bin/debug 下面的 exe(这一步是为了生成客户端代理,需要启动Host) 
  2. 在Client工程里通过添加 Service References,生成客户端Proxy,关闭exe
  1. 在Client工程的Program.cs里添加如下代码。
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
namespace WCFStudy2ConsoleClient  
{  
 class Program  
    {  
 static void Main(string[] args)  
        {  
            MyWcfSvc.Service1Client client = new MyWcfSvc.Service1Client();  
            var result = client.GetData(123);  
            Console.WriteLine(result);  
            Console.Read();  
        }  
    }  
}  
  1. F5 运行Solution里的Host, 再右击Client工程选Debug的Start new instance方式,运行Client

运行结果:

由于ServiceHost实例是被创建在应用程序域中,必须保证宿主进程在调用服务期间不会被关闭,因此利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到人为关闭应用程序。


简单实例-3: 创建 Winform Self-Host

Winform的Self-Host和ConsoleHost类似,先添加 WcfServiceLib 工程引用,将 WcfServiceLib 里的App.config 移到 Winform 工程里。加上启动Service的代码就OK了!

public partial class Form1 : Form  
{  
 public Form1()  
    {  
        InitializeComponent();  
    }  
 private ServiceHost host = null;  
 // 开启服务端 
 private void btnStart_Click(object sender, EventArgs e)  
    {  
 try 
        {  
 if (host != null)  
                    host.Close();  
            host = new ServiceHost(typeof(WcfServiceLib.Service1));  
            host.Open();  
 this.textBox1.Text = "Server Opened!";  
        }  
 catch (Exception ex)  
        {  
            MessageBox.Show(ex.ToString());  
 if (host != null)  
                host.Close();  
        }  
    }  
 // 关闭服务端 
 private void btnStop_Click(object sender, EventArgs e)  
    {  
 if (host != null)  
        {  
            host.Close();  
 this.textBox1.Text += "Server Closed!";  
        }  
    }  
}  

在Winform中,不要使用 using(...) 代码块,这将导致在Button方法结束后自动销毁Host对象而关闭服务。


简单实例-4: 创建 Windows Service Host

Windows Services宿主便于管理者方便地启动或停止服务,且在服务出现故障之后,能够重新启动服务。还可以通过Service Control Manager(服务控制管理器),将服务设置为自动启动方式,省去了服务的管理工作。此外,Windows Services自身还提供了一定的安全性以及检测机制和日志机制。

1. 创建Windows Service工程

2. 引用 WcfServiceLib 工程,添加 App.config (和前面Host添加的App.config一样)

3. 重写 WindowsService 类的 OnStart 和 OnStop 方法

public partial class Service1 : ServiceBase  
{  
 public Service1()  
    {  
        InitializeComponent();  
    }  
 private ServiceHost host = null;  
 protected override void OnStart(string[] args)  
    {  
 if (host != null)  
            host.Close();  
        host = new ServiceHost(typeof(WcfServiceLib.Service1));  
        host.Open();  
    }  
 protected override void OnStop()  
    {  
 if (host != null)  
            host.Close();  
    }  
}  

4. 创建Service的安装类:在WindowsService 类的设计界面上右击选择 [Add Installer]

修改 serviceProcessInstaller 的 Account 属性 (默认为User) 改为 LocalSystem

通过在Visual Studio的 [Command Prompt] (命令行)模式下通过 InstallUtil 工具安装 Windows服务: InstallUtil [绝对路径]/WCFStudy2WindowsServiceHost.exe (安装成功之后,使用Services.msc查看服务)


简单实例-5: 创建 IIS Host

最简单的就是直接创建一个 WCF Service Application 就OK了。

以上所有工程的关系图如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

WCF浅尝

1.首先先建立一个WCF服务应用程序 ? 2.再建立一个宿主程序,这里用控制台,添加服务引用,这里会报错: ? 点击页面确定,回到添加服务页面 ? 点击箭头有如...

35810
来自专栏bluesummer

用Token令牌维护微服务之间的通信安全的实现

在微服务架构中,如果忽略服务的安全性,任由接口暴露在网络中,一旦遭受攻击后果是不可想象的、 保护微服务键安全的常见方案有:1.JWT令牌(token) 2.双向...

3557
来自专栏码农阿宇

.Net Core从命令行读取配置文件

最近在学习博客园腾飞(jesse)的.Net Core视频教程,收益匪浅,在此作推荐 : http://video.jessetalk.cn/ 言归正传,.Ne...

3014
来自专栏技术小讲堂

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

什么是ASP.NET Profile 可以为每个用户(包括匿名用户)储存信息 通过在Web.config中的配置即可在应用程序中使用 强类型的属性 可以定义属性...

4409
来自专栏依乐祝

Asp.Net Core Web Api图片上传(一)

阅读本文章,需要你具备asp.net core的基础知识,至少能够创建一个Asp.Net Core Web Api项目吧!其次,我不会跟你说MongoDB是什么...

6261
来自专栏菩提树下的杨过

Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由

以前在做asp的时候,要把 /default.asp?id=123映射成/default/123,需要借助IISRewriter这个组件,到了asp.net以后...

19510
来自专栏Pythonista

Django之Form功能

Django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm

1572
来自专栏跟着阿笨一起玩NET

winform打开进程与关闭进程

2072
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务

          前面的四篇文章演示ORM的一些常规操作与配置,通过前面的文章,应用开发人员要可以使用ORM开发出简单的应用,但是,ORM也不是万能钥匙,在业...

2059
来自专栏林德熙的博客

VisualStudio 2017 项目格式 自动生成版本号 添加注释防止警告生成的文件自动添加版本

最近我把很多项目都使用了 VisualStudio 2017 新项目格式,在使用的时候发现一些比较好用的功能。 本文告诉大家如何使用 VisualStudio ...

4952

扫码关注云+社区