设计原则:万物皆对象

背景:微软提供了一套强大的通信框架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(半成品)的更多相关文章

  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. 如何取消-"插入耳机自动显示提示框"

    首先我们打开控制面板->1,你可以直接搜索控制面板打开  2,你可以右击我的电脑->点击属性->左上角打开控制面板

  2. 网站被k到可以使用关键词搜索到首页优化总结

    从今年二月份,刚过完年回到公司,大约一周多过后,网站就被不知名黑客攻击,然后又因为网站标题关键词堆砌导致网站被降权,从此首页不在有我的网站的踪迹,有的只是其他页面的信息,因为刚开始接触SEO,对这一块 ...

  3. Scanner对象及其获取数据出现小问题和解决方案

    Scanner类简介: Java 5添加了java.util.Scanner类,我们可以通过Scanner类来获取用户输入.它是以前的StringTokenizer和Matcher类之间的某种结合.由 ...

  4. 机器学习基石笔记:01 The Learning Problem

    原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...

  5. 架构设计之「 CAP 定理 」

    在计算机领域,如果是初入行就算了,如果是多年的老码农还不懂 CAP 定理,那就真的说不过去了.CAP可是每一名技术架构师都必须掌握的基础原则啊. 现在只要是稍微大一点的互联网项目都是采用 分布式 结构 ...

  6. 多元线性回归公式推导及R语言实现

    多元线性回归 多元线性回归模型 实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示. 为了方便计算,我们将上式写成矩阵形式: Y = XW 假设自变量维度为N W ...

  7. MVC中使用Ninject依赖注入

    在.NET MVC中使用Ninject注入,主要分为以下几步: 使用NuGet包添加Ninject引用,我添加的是目前最新版本3.34 在App_Start文件夹下,创建NinjectControll ...

  8. 海康&大华&DSS视频拉流-RTSP转RTMP多媒体播放技术

    海康&大华&DSS获取RTSP 实时流 海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/ ...

  9. 适合精致女孩使用的APP软件 不容错过的精彩人生

    阳光下灿烂,风雨中奔跑,每个人都会遇见美丽的缘分,或深或浅,或浓或淡.所以人生不管遇到什么难题,都要勇往直前.今天分享的软件也是十分精彩的,非常适合精彩的你哦! 薄荷健康 薄荷健康APP是专为想要减肥 ...

  10. Python 强制停止多线程运行

    强制停止多线程运行 by:授客 QQ:1033553122 #!/usr/bin/env python # -*- coding:utf-8 -*-     __author__ = 'shouke' ...