设计原则:万物皆对象

背景:微软提供了一套强大的通信框架Wcf,了解请看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin

虽然这套通信框架很强大,但是配置起来也不简单,因此导致很多人望而却步(包括我),我这人向来不喜欢麻烦,喜欢简单,最好就是给我一个对象,告诉我怎么传参就使用是最爽的,我相信应该有很多人跟我一样的想法,因此,这篇文章应运而生,没错,就是零配置使用Wcf,下面我会详细道来。

正文:

1、核心类库,注意,需要引用程序集

  1. System.ServiceModel

WcfHost.cs

  1. using System;
  2. using System.ServiceModel;
  3. using System.ServiceModel.Description;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Coldairarrow.Util.Wcf
  7. {
  8. /// <summary>
  9. /// Wcf服务代码控制类(必须开启管理员权限)
  10. /// </summary>
  11. /// <typeparam name="Service">服务处理</typeparam>
  12. /// <typeparam name="IService">服务接口</typeparam>
  13. public class WcfHost<Service,IService>
  14. {
  15. #region 构造函数
  16.  
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="baseUrl">http基地址(服务器真实地址),默认为:http://127.0.0.1:14725/ </param>
  21. /// <param name="httpGetUrl">http获取服务引用的地址(服务器真实地址),默认为:http://127.0.0.1:14725/mex </param>
  22. public WcfHost(string baseUrl= "http://127.0.0.1:14725/", string httpGetUrl= "http://127.0.0.1:14725/mex")
  23. {
  24. _serviceHost = new ServiceHost(typeof(Service), new Uri(baseUrl));
  25. //ServiceEndPoint 终结点 包含Address地址 Binding绑定 Contracts契约 简称ABC
  26. _serviceHost.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), typeof(Service).Name);
  27. //添加服务终结点
  28. if (_serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
  29. {
  30. //判断是否在配置文件中定义了元数据终结点
  31. ServiceMetadataBehavior metaData = new ServiceMetadataBehavior();
  32. metaData.HttpGetEnabled = true;
  33. metaData.HttpGetUrl = new Uri(httpGetUrl);
  34. _serviceHost.Description.Behaviors.Add(metaData);//添加元数据终结点
  35. }
  36. }
  37.  
  38. #endregion
  39.  
  40. #region 私有成员
  41.  
  42. private ServiceHost _serviceHost;
  43.  
  44. #endregion
  45.  
  46. #region 外部接口
  47.  
  48. /// <summary>
  49. /// 开始Wcf服务
  50. /// </summary>
  51. public void StartHost()
  52. {
  53. Task task = new Task(() =>
  54. {
  55. try
  56. {
  57. if (HandleHostOpened != null)
  58. _serviceHost.Opened += new EventHandler(HandleHostOpened);
  59.  
  60. if (_serviceHost.State != CommunicationState.Opened)
  61. {
  62. _serviceHost.Open();
  63. }
  64. }
  65. catch (Exception ex)
  66. {
  67. HandleException?.Invoke(ex);
  68. }
  69. });
  70. task.Start();
  71. }
  72.  
  73. #endregion
  74.  
  75. #region 事件处理
  76.  
  77. /// <summary>
  78. /// 当Wcf服务开启后执行
  79. /// </summary>
  80. public Action<object, EventArgs> HandleHostOpened { get; set; }
  81.  
  82. /// <summary>
  83. /// 异常处理
  84. /// </summary>
  85. public Action<Exception> HandleException { get; set; }
  86.  
  87. #endregion
  88. }
  89. }

2、服务端使用:

服务接口定义:

IService.cs

  1. using System.ServiceModel;
  2.  
  3. namespace _01.WcfServer
  4. {
  5. /// <summary>
  6. /// 对外提供的接口规范,必须要ServiceContract特性
  7. /// </summary>
  8. [ServiceContract]
  9. public interface IService
  10. {
  11. /// <summary>
  12. /// 对外提供的接口方法,必须OperationContract特性,方法不能重载
  13. /// </summary>
  14. /// <returns></returns>
  15. [OperationContract]
  16. string Hello();
  17. }
  18. }

服务接口实现:

Service.cs

  1. namespace _01.WcfServer
  2. {
  3. /// <summary>
  4. /// 接口具体实现类
  5. /// </summary>
  6. public class Service : IService
  7. {
  8. /// <summary>
  9. /// 方法具体实现
  10. /// </summary>
  11. /// <returns></returns>
  12. public string Hello()
  13. {
  14. return "Hello World";
  15. }
  16. }
  17. }

服务端运行:注意,必须以管理员权限运行

Program.cs

  1. using Coldairarrow.Util.Wcf;
  2. using System;
  3.  
  4. namespace _01.WcfServer
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. //创建Wcf服务对象,泛型参数Service为实现类,IService为服务接口
  11. //第一个参数baseUrl为服务基地址(必须为真实地址)
  12. //第二个参数httpGetUrl为服务引用地址(必须为真实地址),也就是客户端添加服务引用时用的地址
  13. WcfHost<Service, IService> wcfHost = new WcfHost<Service, IService>("http://localhost:14725", "http://localhost:14725/mex");
  14.  
  15. //当Wcf服务开启后执行的事件
  16. wcfHost.HandleHostOpened = new Action<object, EventArgs>((obj, tar) =>
  17. {
  18. Console.WriteLine("服务已启动!");
  19. });
  20.  
  21. //开始Wcf服务
  22. wcfHost.StartHost();
  23.  
  24. while(Console.ReadLine()!="quit")
  25. {
  26.  
  27. }
  28. }
  29. }
  30. }

客户端使用:

Program.cs

  1. using System;
  2.  
  3. namespace _02.WcfClient
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. //ServiceReference1为引用时自定义的命名空间
  10. //ServiceClient为具体实现类,Service为类名,Client为后缀
  11. //可以在很多地方使用,比如控制台,Winform,ASP.NET网站等,把它当做一个类库就很好理解了66666
  12. ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
  13.  
  14. //调用Service提供的Hello方法,Wcf服务端必须运行
  15. var data = client.Hello();
  16. Console.WriteLine(data);
  17.  
  18. Console.ReadKey();
  19. }
  20. }
  21. }

详细使用步骤:

1、运行Wcf服务端,必须以管理员权限

2、打开浏览器,测试Wcf是否成功开启

3、客户端引用服务

右键引用,引用服务,输入服务地址(即Wcf初始化时第二个参数)

3、客户端代码调用

2、客户端成功运行

总结:

全程实现真正的0配置搭建了Wcf服务,满不满意,意不意外,惊不惊喜,爽不爽~~

最后,惯例,全部代码代码在GitHub,欢迎大家点赞~

https://github.com/Coldairarrow/Wcf

C# .NET 0配置使用Wcf(半成品)的更多相关文章

  1. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  2. IIS运行.NET4.0配置

    IIS运行.NET4.0配置 “/CRM”应用程序中的服务器错误.配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法 ...

  3. kafka0.9.0及0.10.0配置属性

    问题导读1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置?borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segm ...

  4. VC++6.0 配置CppUTest测试环境

    最近看<软件项目成功之道>,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单 ...

  5. win7下VS2015+opencv3.1.0配置

    由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...

  6. Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的Hadoop2.2.0开发环境

    原文地址:http://www.linuxidc.com/Linux/2014-11/109200.htm 图文详解Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的H ...

  7. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  8. windows下Qt5.1.0配置android环境搭建 good

    1.首先下载好需要配置的软件: 1>Qt 5.1.0 for Android (Windows 32-bit, 716 MB)(Info)下载地址: http://qt-project.org/ ...

  9. ganglia监控hadoop2.0配置方法

    ganglia监控hadoop2.0配置方法前提:hadoop2.0集群已安装ganglia监控工具第一步:Hadoop用户登录集群每一个节点,修改文件:vi /opt/hadoop-2.0.0-cd ...

随机推荐

  1. ajax data属性传值的方式总结

    在和后台同事对接口的时候,有一个小问题一直困扰着我.那就是用ajax请求后台接口数据,需要用data属性传值的时候,data属性传值的方式感觉没有统一用一种方式. 后来仔细想想,其实哪种方式都可以,主 ...

  2. 【设计模式+原型理解】第三章:javascript五种继承父类方式

    [前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过 ...

  3. 【大数据安全】Apache Kylin 安全配置(Kerberos)

    1. 概述 本文首先会简单介绍Kylin的安装配置,然后介绍启用Kerberos的CDH集群中如何部署及使用Kylin. Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spa ...

  4. C++项目中采用CLR的方式调用C#编写的dll

    1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...

  5. revit二次开发wpf里button按钮无法实现事务

    不能在revit提供的api外部使用事务,解决此方法, 1.把button里要实现的功能写到外部事件IExternalEventHandler中,注册外部事件,在button事件中.raise()使用 ...

  6. Php7.3 could not find driver

    今天phpstudy升级php7.3,发现框架报错:could not find driver,后来发现默认php.ini的配置有几个是注释掉的,配置php.ini,修改如下 extension=my ...

  7. SSM框架使用

    现在的主流框架有SSH和SSM. SSM:SpringMVC(controller)+Spring(管理各组件)+Mybaits SSH:Struct2(controller)+Spring(管理各组 ...

  8. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

  9. iframe 父页面调用子页面的vue方法

                    父页面代码:            html: <div id="app"> //省略业务代码x行..... <iframe sr ...

  10. 剑指前端(前端入门笔记)——Date类型

    Date类型 ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜(零时)开始经过的 ...