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 ...
随机推荐
- 6. VIM 系列 - 全局搜索(ctrlsf.vim)
目录 全局搜索利器 ag.vim 更强大的全局搜索利器 ctrlsf.vim 全局搜索利器 ag.vim 终端上安装ag: sudo apt install silversearcher-ag vim ...
- python爬虫之selenium、phantomJs
图片懒加载技术 什么是图片懒加载技术 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时 ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
- PS抠图简单粗暴2种方法
1.矩形框住要抠的→ Ctrl+j →选中图层 →矩形框住 →图像裁剪另存为 2.钢笔工具框住要抠的→ Ctrl+Enter→ Ctrl+j→.钢笔框住→图像裁剪另存为
- Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!
前段时间分享了<阅读跟踪 Java 源码的几个小技巧>是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧. 所以,为了满足众多 IDEA 粉丝的要求,栈长我 ...
- 你真的了解webview么?
你真的了解webview么? 写在前面: Webview是我们前端开发从PC端演进到移动端的一个重要载体,现在大家每天使用的App,webview都发挥着它的重要性.接下来让我们从webview看世界 ...
- 【ElasticSearch篇】--ElasticSearch从初识到安装和应用
一.前述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,在企业中全文搜索时,特别常用. 二.常用概念 clu ...
- python接口自动化(四)--接口测试工具介绍(详解)
简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识.那么接下来让我们看看接口测试的工具有哪些. 目前,市场上有很多支持接口测试的工具.利用工具进行接口测试,能够提供 ...
- Python3中性能测试工具Locust安装使用
Locust安装使用: 安装: python3中 ---> pip3 install locust 验证是否安装成功---> 终端中输入 locust --help ...
- 【转载】java final 关键字的几种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...