• 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

  • 相关阅读:
    Spring Boot中报错org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. Available parameters are [0, 1, param1, param2]的解决办法
    CockroachDB学习笔记——[译]Cgo的成本与复杂性
    CockroachDB学习笔记——[译]如何优化Go语言中的垃圾回收
    解决Java中的HttpServletResponse中文乱码问题
    Spring Boot自定义Mapper的SQL语句
    Spring Boot设置定时任务
    Java8中List的removeif()函数的使用示例
    skip list跳跃表实现
    五分钟理解一致性哈希算法(consistent hashing)
    github 更新fork分支
  • 原文地址:https://www.cnblogs.com/coldairarrow/p/7502397.html
Copyright © 2020-2023  润新知