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 条评论
登录 后参与评论

相关文章

来自专栏bluesummer

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

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

3257
来自专栏技术博客

Asp.Net MVC3.0网站统计登录认证的在线人数

  对于一个网站来说,统计在线人数是一个很重要的工作。平时也发现很多的网站论坛等都有在线人数的显示。对于一个网站如果在线人数很多,用户看到了这么个数字也是很了不...

872
来自专栏.NET开发那点事

AServer - 基于Asp.net core Kestrel的超迷你http服务器

  AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里,用来快速的响应Http请求,而不...

891
来自专栏Pythonista

Django之Form功能

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

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

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

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

18510
来自专栏技术博客

WCF HttpContext.Current为空的问题

原来在项目中使用HttpContext.Current没什么问题,但是到了中期阶段,项目重构等,并且要求使用WCF,所以就出现了HttpContext.Curr...

832
来自专栏大内老A

WCF技术剖析之二:再谈IIS与ASP.NET管道

在2007年9月份,我曾经写了三篇详细介绍IIS架构和ASP.NET运行时管道的文章,深入介绍了IIS 5.x与IIS 6.0HTTP请求的监听与分发机制,以及...

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

webservice 缓存机制

本文转载:http://blog.csdn.net/zhdd1234/article/details/4555472

1441
来自专栏依乐祝

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

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

2041
来自专栏技术小讲堂

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

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

4209

扫码关注云+社区