C# .NET 0布局使用Wcf(半成品)

布置条件:万物皆对象

背景:微软提供了壹套强大的通讯框架Wcf,领会请看百度宏观:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin

固然如此那套通讯框架很强劲,可是配置起来也不不难,由此导致无独有偶人害怕(包罗自家),小编那人向来不欣赏麻烦,喜欢简单,最好正是给本身二个目的,告诉本身怎么传参就使用是最爽的,作者相信应该有众四人跟本身一样的想法,由此,那篇小说应运而生,没有错,就是零配置利用Wcf,上边作者会详细道来。

 

正文:

壹、宗旨类库,注意,必要引用程序集

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
    }
}

二、服务端使用:

劳务接口定义:

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();
        }
    }
}

详尽使用手续:

一、运营Wcf服务端,必须以管理人权限

图片 1

2、打开浏览器,测试Wcf是或不是成功打开

图片 2

 

三、客户端引用服务

右键引用,引用服务,输入服务地点(即Wcf起头化时第二个参数)

图片 3

3、客户端代码调用

图片 4

2、客户端成功运行

图片 5

 

总结:

全程达成真正的0配置搭建了Wcf服务,满不满足,意不意外,惊不惊喜,爽不爽~~

终极,惯例,全体代码代码在GitHub,欢迎大家点赞~

https://github.com/Coldairarrow/Wcf

相关文章