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 ...
随机推荐
- 【机器学习】--xgboost从初识到应用
一.前述 在 Kaggle 的很多比赛中,我们可以看到很多 winner 喜欢用 xgboost,而且获得非常好的表现,今天就来看看 xgboost 到底是什么以及如何应用.Gradient boos ...
- ionic4 混合移动开发 (前世今生)
ionic 从2016年初识,经历了 ionic2 ionic3.至今 ionic4,终于在2018年7月份发布了测试版. ionic Framework 可以说得上是最接近原生app的ui组件,漂亮 ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- Dapper的基本 理论 知识
简述 Dapper是一个轻量级的ORM工具:ORM框架的核心思想是对象关系映射,ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的.从数据库提取的数据会自动按 ...
- jquery中的$.fn的用法
JQuery里的原型prototype分析 http://www.nowamagic.net/librarys/veda/detail/653 jquery中的$.fn的用法 ...
- 使用tensorflow搭建自己的验证码识别系统
目录 准备验证码数据 保存为tfrecords文件 验证码训练 学习tensorflow有一段时间了,想做点东西来练一下手.为了更有意思点,下面将搭建一个简单的验证码识别系统. 准备验证码数据 下面将 ...
- Excel的读取和保存(POI)
示例 Excel文件: 数据读取: 保存路径: Jar包准备 下载地址: 链接:https://pan.baidu.com/s/1RZAwEsFwjKMlnYYGwHMfaA 提取码:h9mj 文件上 ...
- 如何将workerman部署到windows服务器上面
一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swoole是C语言编写的php扩展,其配置起 ...
- Django 提交 form 表单(使用sqlite3保存数据)
优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...
- 基于hadoop分析,了解hive的使用
一.Hadoop理论 Hadoop是一个专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式. Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce ...