C# .NET 0配置使用Wcf(半成品)
设计原则:万物皆对象
背景:微软提供了一套强大的通信框架Wcf,了解请看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin
虽然这套通信框架很强大,但是配置起来也不简单,因此导致很多人望而却步(包括我),我这人向来不喜欢麻烦,喜欢简单,最好就是给我一个对象,告诉我怎么传参就使用是最爽的,我相信应该有很多人跟我一样的想法,因此,这篇文章应运而生,没错,就是零配置使用Wcf,下面我会详细道来。
正文:
1、核心类库,注意,需要引用程序集
- System.ServiceModel
WcfHost.cs
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Description;
- using System.Threading.Tasks;
- namespace Coldairarrow.Util.Wcf
- {
- /// <summary>
- /// Wcf服务代码控制类(必须开启管理员权限)
- /// </summary>
- /// <typeparam name="Service">服务处理</typeparam>
- /// <typeparam name="IService">服务接口</typeparam>
- public class WcfHost<Service,IService>
- {
- #region 构造函数
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="baseUrl">http基地址(服务器真实地址),默认为:http://127.0.0.1:14725/ </param>
- /// <param name="httpGetUrl">http获取服务引用的地址(服务器真实地址),默认为:http://127.0.0.1:14725/mex </param>
- public WcfHost(string baseUrl= "http://127.0.0.1:14725/", string httpGetUrl= "http://127.0.0.1:14725/mex")
- {
- _serviceHost = new ServiceHost(typeof(Service), new Uri(baseUrl));
- //ServiceEndPoint 终结点 包含Address地址 Binding绑定 Contracts契约 简称ABC
- _serviceHost.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), typeof(Service).Name);
- //添加服务终结点
- if (_serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
- {
- //判断是否在配置文件中定义了元数据终结点
- ServiceMetadataBehavior metaData = new ServiceMetadataBehavior();
- metaData.HttpGetEnabled = true;
- metaData.HttpGetUrl = new Uri(httpGetUrl);
- _serviceHost.Description.Behaviors.Add(metaData);//添加元数据终结点
- }
- }
- #endregion
- #region 私有成员
- private ServiceHost _serviceHost;
- #endregion
- #region 外部接口
- /// <summary>
- /// 开始Wcf服务
- /// </summary>
- public void StartHost()
- {
- Task task = new Task(() =>
- {
- try
- {
- if (HandleHostOpened != null)
- _serviceHost.Opened += new EventHandler(HandleHostOpened);
- if (_serviceHost.State != CommunicationState.Opened)
- {
- _serviceHost.Open();
- }
- }
- catch (Exception ex)
- {
- HandleException?.Invoke(ex);
- }
- });
- task.Start();
- }
- #endregion
- #region 事件处理
- /// <summary>
- /// 当Wcf服务开启后执行
- /// </summary>
- public Action<object, EventArgs> HandleHostOpened { get; set; }
- /// <summary>
- /// 异常处理
- /// </summary>
- public Action<Exception> HandleException { get; set; }
- #endregion
- }
- }
2、服务端使用:
服务接口定义:
IService.cs
- using System.ServiceModel;
- namespace _01.WcfServer
- {
- /// <summary>
- /// 对外提供的接口规范,必须要ServiceContract特性
- /// </summary>
- [ServiceContract]
- public interface IService
- {
- /// <summary>
- /// 对外提供的接口方法,必须OperationContract特性,方法不能重载
- /// </summary>
- /// <returns></returns>
- [OperationContract]
- string Hello();
- }
- }
服务接口实现:
Service.cs
- namespace _01.WcfServer
- {
- /// <summary>
- /// 接口具体实现类
- /// </summary>
- public class Service : IService
- {
- /// <summary>
- /// 方法具体实现
- /// </summary>
- /// <returns></returns>
- public string Hello()
- {
- return "Hello World";
- }
- }
- }
服务端运行:注意,必须以管理员权限运行
Program.cs
- using Coldairarrow.Util.Wcf;
- using System;
- namespace _01.WcfServer
- {
- class Program
- {
- static void Main(string[] args)
- {
- //创建Wcf服务对象,泛型参数Service为实现类,IService为服务接口
- //第一个参数baseUrl为服务基地址(必须为真实地址)
- //第二个参数httpGetUrl为服务引用地址(必须为真实地址),也就是客户端添加服务引用时用的地址
- WcfHost<Service, IService> wcfHost = new WcfHost<Service, IService>("http://localhost:14725", "http://localhost:14725/mex");
- //当Wcf服务开启后执行的事件
- wcfHost.HandleHostOpened = new Action<object, EventArgs>((obj, tar) =>
- {
- Console.WriteLine("服务已启动!");
- });
- //开始Wcf服务
- wcfHost.StartHost();
- while(Console.ReadLine()!="quit")
- {
- }
- }
- }
- }
客户端使用:
Program.cs
- using System;
- namespace _02.WcfClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- //ServiceReference1为引用时自定义的命名空间
- //ServiceClient为具体实现类,Service为类名,Client为后缀
- //可以在很多地方使用,比如控制台,Winform,ASP.NET网站等,把它当做一个类库就很好理解了66666
- ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
- //调用Service提供的Hello方法,Wcf服务端必须运行
- var data = client.Hello();
- Console.WriteLine(data);
- Console.ReadKey();
- }
- }
- }
详细使用步骤:
1、运行Wcf服务端,必须以管理员权限
2、打开浏览器,测试Wcf是否成功开启
3、客户端引用服务
右键引用,引用服务,输入服务地址(即Wcf初始化时第二个参数)
3、客户端代码调用
2、客户端成功运行
总结:
全程实现真正的0配置搭建了Wcf服务,满不满意,意不意外,惊不惊喜,爽不爽~~
最后,惯例,全部代码代码在GitHub,欢迎大家点赞~
https://github.com/Coldairarrow/Wcf
C# .NET 0配置使用Wcf(半成品)的更多相关文章
- .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 ...
- IIS运行.NET4.0配置
IIS运行.NET4.0配置 “/CRM”应用程序中的服务器错误.配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法 ...
- kafka0.9.0及0.10.0配置属性
问题导读1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置?borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segm ...
- VC++6.0 配置CppUTest测试环境
最近看<软件项目成功之道>,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单 ...
- win7下VS2015+opencv3.1.0配置
由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...
- 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 ...
- 精进不休 .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 ...
- windows下Qt5.1.0配置android环境搭建 good
1.首先下载好需要配置的软件: 1>Qt 5.1.0 for Android (Windows 32-bit, 716 MB)(Info)下载地址: http://qt-project.org/ ...
- ganglia监控hadoop2.0配置方法
ganglia监控hadoop2.0配置方法前提:hadoop2.0集群已安装ganglia监控工具第一步:Hadoop用户登录集群每一个节点,修改文件:vi /opt/hadoop-2.0.0-cd ...
随机推荐
- ajax data属性传值的方式总结
在和后台同事对接口的时候,有一个小问题一直困扰着我.那就是用ajax请求后台接口数据,需要用data属性传值的时候,data属性传值的方式感觉没有统一用一种方式. 后来仔细想想,其实哪种方式都可以,主 ...
- 【设计模式+原型理解】第三章:javascript五种继承父类方式
[前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过 ...
- 【大数据安全】Apache Kylin 安全配置(Kerberos)
1. 概述 本文首先会简单介绍Kylin的安装配置,然后介绍启用Kerberos的CDH集群中如何部署及使用Kylin. Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spa ...
- C++项目中采用CLR的方式调用C#编写的dll
1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...
- revit二次开发wpf里button按钮无法实现事务
不能在revit提供的api外部使用事务,解决此方法, 1.把button里要实现的功能写到外部事件IExternalEventHandler中,注册外部事件,在button事件中.raise()使用 ...
- Php7.3 could not find driver
今天phpstudy升级php7.3,发现框架报错:could not find driver,后来发现默认php.ini的配置有几个是注释掉的,配置php.ini,修改如下 extension=my ...
- SSM框架使用
现在的主流框架有SSH和SSM. SSM:SpringMVC(controller)+Spring(管理各组件)+Mybaits SSH:Struct2(controller)+Spring(管理各组 ...
- 面试常问的几个排序和查找算法,PHP实现
冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...
- iframe 父页面调用子页面的vue方法
父页面代码: html: <div id="app"> //省略业务代码x行..... <iframe sr ...
- 剑指前端(前端入门笔记)——Date类型
Date类型 ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜(零时)开始经过的 ...