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

posted @ 2017-09-10 21:31 寒空飞箭 阅读(...) 评论(...) 编辑 收藏