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,欢迎大家点赞~