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

相关文章

来自专栏LeoXu的博客

[Hibernate]有关jar文件 原

http://sourceforge.net/projects/hibernate/files/hibernate3/

421
来自专栏Java技术栈

Spring Boot自动配置原理、实战

Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到...

3264
来自专栏实战docker

Java实战操作MongoDB集群(副本集)

Spring提供了MongoDB操作的工具:MongoTemplate,使得在Spring环境下对MongoDB的操作更为便利,本章我们就来学一下如何用Mong...

2229
来自专栏程序你好

ASP.NET Core RESTful Web服务开发教程

在本文中,我将逐步解释如何在ASP.NET Core中开发基于RESTful的Web服务应用程序。ASP.NET Core是微软最新发布的技术,比之前的WCF和...

876
来自专栏Zephery

Spring项目路径

Spring源码——WebUtils 个人网站中部署的服务器共有两台,由于是分布式的环境,为了防止有效的针对具体某个服务器出现的问题,需要在网页上加上服务器的I...

3554
来自专栏JAVA后端开发

spring boot2集成activiti6的问题记录

经查,是因为我用mybatis plus,要求用mybatis3.4.6,而activiti用的是mybatis3.4.2,两边有冲突,直接排除activiti...

1533
来自专栏王磊的博客

C#调用Couchbase中的Memcached缓存

安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64...

2559
来自专栏编程软文

快速上手友盟推送前后端

2015
来自专栏noteless

eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis

如果搜索不到内容,或者有报错信息(index downloads are disabled ,search results may be incomplete)

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

向jboss写入服务器日志

实际开发中,记录日志是常用的功能,jboss默认情况下已经记录了很多运行日志,如果开发人员要手动在server.log中写入日志,可以参考下面的方法: 1 p...

1956

扫码关注云+社区