WCF 简单架构(二) 实现服务

基于wcf契约的实现,可根据需要自行处理。这里加上简单的抽象基类,方便之后扩展,基类中可加入计数,日志等监控功能

/// <summary>
    /// 所有wcf实现处理基类
    /// </summary>
    public abstract class WcfServiceBase : IWcfService
    {
        protected abstract WcfResponse RequestFun(WcfRequest req);

        /// <summary>
        /// 所有外部请求的接收方法
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public virtual WcfResponse Request(WcfRequest req)
        {
            WcfResponse res = null;
            try
            {   
		// 可在此处加入日志等内容
		.........
                var resFun = RequestFun(req);
                if (resFun != null)
                {
                    resFun.Head.IsSuccess = true;
                    return resFun;
                }

                throw new Exception(
                    string.Format("调用的方法不存在 {0}", req.Head.RequestMethodName));
            }
            catch (Exception ex)
            {
                if (res == null)
                    res = new WcfResponse();

                Exception innerExp = ex;

                while (innerExp.InnerException != null)
                {
                    innerExp = innerExp.InnerException;
                }
                res.Head.Message = string.Format("{0}-{1}", ex.Message, innerExp.Message);

                res.Head.IsSuccess = false;
            }
            return res;
        }
    }

具体使用时只需要继承此类和对应的契约接口,可以如下实现,实现的是具体的业务接口对应的方法

    public class Hello_WCF : WcfServiceBase, IWcfHello
    {        

        protected override WcfResponse RequestFun(WcfRequest req)
        {
            WcfResponse res = new WcfResponse();
            object[] objs = (object[])req.Body.Parameters;

            Hello biz = new Hello();

            switch (req.Head.RequestMethodName)
            {
                case "CallHello":
                    res.Body.Data = biz.CallHello((UserEntity)objs[0]);
                    break;
                case "Times":
                    res.Body.Data = biz.Times();
                    break;
                case "Reset":
                    biz.Reset();
                    break;
                default :
                    return null;
            }

            res.Head.IsSuccess = true;
            return res;
        }
    }


为了能跑起来,还需要加上配置,为了通用不进行xml配置了,使用代码简单实现,有需要的同学也可以把它改为反射配置,会更灵活

        static void Main(string[] args)
        {
            try
            {

                string address = "net.tcp://127.0.0.1:20001/WCFService/IHello";
                Uri add = new Uri(address);
                var bind = new NetTcpBinding();
                bind.Security.Mode = SecurityMode.None; 
                var host = new ServiceHost(typeof(Hello_WCF));
                var contract = typeof(IWcfHello);
                host.AddServiceEndpoint(contract, bind, address);
                host.Open();
                Console.WriteLine("Press enter will be closed  .... ");
                Console.ReadLine();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }

完整的源代码可到 此地下载




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值