C# .NET 0配置使用Wcf

来源:互联网 发布:蘑菇街秒杀软件 编辑:程序博客网 时间:2024/06/03 19:39

设计原则:万物皆对象

背景:微软提供了一套强大的通信框架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