Example #1
0
        /// <summary>
        /// 根据绑定中的协议类型调用不同的实现方法
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        private static ESB.Core.Schema.务响应 CallService(CallState callState)
        {
            ESBProxy esbProxy = ESBProxy.GetInstance();

            Boolean noCache = false;

            if (callState.InvokeParam != null)
            {
                noCache = (callState.InvokeParam.NoCache == 1);
            }

            //--如果缓存失效时间大于0,则优先从缓存中获取数据
            if (callState.ServiceConfig.CacheDuration > 0)
            {
                String key = String.Format("MBSOA:{0}:{1}:{2}", callState.Request.务名称, callState.Request.方法名称, DataHelper.Hash(callState.Request.消息内容));

                DateTime callBeginTime = DateTime.Now;
                //--如果noCache为True则强制调用后台服务,刷新缓存
                String   message     = noCache ? String.Empty : esbProxy.CacheManager.GetCache(key);
                DateTime callEndTime = DateTime.Now;

                if (String.IsNullOrEmpty(message))
                {
                    ESB.Core.Schema.务响应 res = CallProxy(callState);
                    esbProxy.CacheManager.SetCache(key, res.消息内容, callState.ServiceConfig.CacheDuration);

                    return(res);
                }
                else
                {
                    ESB.Core.Schema.务响应 res = new Schema.务响应()
                    {
                        消息内容 = message
                    };
                    callState.CallBeginTime = callBeginTime;
                    callState.CallEndTime   = callEndTime;
                    LogUtil.AddAuditLog(1, callState.Binding, callState, message, callState.Request, 1);

                    return(res);
                }
            }
            else
            {
                return(CallProxy(callState));
            }
        }
Example #2
0
 /// <summary>
 /// 根据绑定的不同类型调用相关代理获取服务返回值
 /// </summary>
 /// <param name="callState"></param>
 /// <returns></returns>
 private static ESB.Core.Schema.服务响应 CallProxy(CallState callState)
 {
     switch (callState.Binding.BindingType)
     {
         case (int)BindingType.WebService:
             return WebServiceClient.CallWebService(callState);
         case (int)BindingType.REST:
             return RestfulClient.CallRestfulService(callState);
         case (int)BindingType.ASHX:
             return HandlerClient.CallAshxService(callState);
         case (int)BindingType.WCF_HTTP:
             return WcfClient.CallWcfService(callState);
         case (int)BindingType.DUBBO_JSON:
             return DubboClient.CallDubboService(callState);
         default:
             throw LogUtil.ExceptionAndLog(callState, "未知的绑定类型", callState.Binding.BindingType.ToString(), callState.Binding, callState.Request);
     }
 }
Example #3
0
        public const String COMPANY_URL = "http://mb.com";//--公司网址,用于SOAP协议中的基地址

        /// <summary>
        /// 动态调用WebService主函数
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.服务响应 DynamicalCallWebService(
              Boolean needResponse
            , ESB.Core.Schema.服务请求 request)
        {
            //--记录接收时间并放在请求结束时间中,用于判读ESB在接到请求到开始调用的耗时
            DateTime receiveDateTime = DateTime.Now;

            //--验证并预处理请求参数
            InvalidRequest(request);

            //--获取到请求对应服务的绑定
            EntityList<BindingTemplate> bindings = GetBindings(request);

            //--如果只有一个绑定,且需要返回结果
            if (bindings.Count == 1 && needResponse == true)
            {
                CallState state = new CallState()
                {
                    Binding = bindings[0],
                    Request = request,
                    RequestBeginTime = request.请求时间,
                    RequestEndTime = receiveDateTime
                };

                return CallService(state);
            }
            else //--如果有多个绑定则默认为发布、订阅模式,不需要将每个订阅则的结果都放回给调用方,或者指明是不需要返回结果的情况(单向调用)
            {
                foreach (BindingTemplate binding in bindings)
                {
                    CallState state = new CallState()
                    {
                        Binding = binding,
                        Request = request,
                        RequestBeginTime = request.请求时间,
                        RequestEndTime = receiveDateTime
                    };

                    ThreadPoolX.QueueUserWorkItem(() => CallService(state));
                }
                return GetMultiResponse();
            }
        }
Example #4
0
        public const String COMPANY_URL = "http://mb.com";//--公司网址,用于SOAP协议中的基地址

        /// <summary>
        /// 动态调用WebService主函数
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.务响应 DynamicalCallWebService(
            Boolean needResponse
            , ESB.Core.Schema.务请求 request)
        {
            //--记录接收时间并放在请求结束时间中,用于判读ESB在接到请求到开始调用的耗时
            DateTime receiveDateTime = DateTime.Now;

            //--验证并预处理请求参数
            InvalidRequest(request);

            //--获取到请求对应服务的绑定
            EntityList <BindingTemplate> bindings = GetBindings(request);

            //--如果只有一个绑定,且需要返回结果
            if (bindings.Count == 1 && needResponse == true)
            {
                CallState state = new CallState()
                {
                    Binding          = bindings[0],
                    Request          = request,
                    RequestBeginTime = request.请求时间,
                    RequestEndTime   = receiveDateTime
                };

                return(CallService(state));
            }
            else //--如果有多个绑定则默认为发布、订阅模式,不需要将每个订阅则的结果都放回给调用方,或者指明是不需要返回结果的情况(单向调用)
            {
                foreach (BindingTemplate binding in bindings)
                {
                    CallState state = new CallState()
                    {
                        Binding          = binding,
                        Request          = request,
                        RequestBeginTime = request.请求时间,
                        RequestEndTime   = receiveDateTime
                    };

                    ThreadPoolX.QueueUserWorkItem(() => CallService(state));
                }
                return(GetMultiResponse());
            }
        }
Example #5
0
        /// <summary>
        /// 根据绑定中的协议类型调用不同的实现方法
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        private static ESB.Core.Schema.务响应 CallService(CallState callState)
        {
            switch (callState.Binding.BindingType)
            {
            case (int)BindingType.WebService:
                return(SoapClient.CallWebService(callState));

            case (int)BindingType.REST:
                return(RestfulClient.CallRestfulService(callState));

            case (int)BindingType.ASHX:
                return(HandlerClient.CallAshxService(callState));

            case (int)BindingType.WCF_HTTP:
                return(WcfClient.CallWcfService(callState));

            default:
                throw LogUtil.ExceptionAndLog(callState, "未知的绑定类型", callState.Binding.BindingType.ToString(), callState.Binding, callState.Request);
            }
        }
Example #6
0
        /// <summary>
        /// 动态调用WebService主函数
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.服务响应 DynamicalCallWebService(
            Boolean needResponse
            , ESB.Core.Schema.服务请求 request
            , List<BindingTemplate> bindings
            , Int32 version
            , EsbView_ServiceConfig serviceConfig
            , AdvanceInvokeParam invokeParam)
        {
            //--记录接收时间并放在请求结束时间中,用于判读ESB在接到请求到开始调用的耗时
            DateTime receiveDateTime = DateTime.Now;

            //--验证并预处理请求参数
            InvalidRequest(request);

            //--获取跟踪上下文
            ESBTraceContext esbTraceContext = GetEsbTraceContext();

            //--获取到请求对应服务的绑定
            BindingTemplate binding = LoadBalance.GetBinding(bindings, serviceConfig.HBPolicy);

            //--构造调用参数
            CallState state = new CallState()
            {
                Binding = binding,
                ServiceConfig = serviceConfig,
                InvokeParam = invokeParam,
                Request = request,
                RequestBeginTime = request.请求时间,
                RequestEndTime = receiveDateTime,
                TraceContext = esbTraceContext,
                ServiceVersion = version,
                MessageID = Guid.NewGuid().ToString()
            };

            return CallService(state);
        }
Example #7
0
        /// <summary>
        /// 动态调用WebService主函数
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.务响应 DynamicalCallWebService(
            Boolean needResponse
            , ESB.Core.Schema.务请求 request
            , List <BindingTemplate> bindings
            , Int32 version
            , EsbView_ServiceConfig serviceConfig
            , AdvanceInvokeParam invokeParam)
        {
            //--记录接收时间并放在请求结束时间中,用于判读ESB在接到请求到开始调用的耗时
            DateTime receiveDateTime = DateTime.Now;

            //--验证并预处理请求参数
            InvalidRequest(request);

            //--获取跟踪上下文
            ESBTraceContext esbTraceContext = GetEsbTraceContext();

            //--获取到请求对应服务的绑定
            BindingTemplate binding = LoadBalance.GetBinding(bindings, serviceConfig.HBPolicy);

            //--构造调用参数
            CallState state = new CallState()
            {
                Binding          = binding,
                ServiceConfig    = serviceConfig,
                InvokeParam      = invokeParam,
                Request          = request,
                RequestBeginTime = request.请求时间,
                RequestEndTime   = receiveDateTime,
                TraceContext     = esbTraceContext,
                ServiceVersion   = version,
                MessageID        = Guid.NewGuid().ToString()
            };

            return(CallService(state));
        }
Example #8
0
        public static ESB.Core.Schema.务响应 CallWcfService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.务请求 request = callState.Request;
            String          message     = callState.Request.消息内容;
            BindingTemplate binding     = callState.Binding;
            String          uri         = callState.Binding.Address;

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.务响应 response = new ESB.Core.Schema.务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Method      = "POST";
                webRequest.ContentType = "text/xml";

                if (String.IsNullOrEmpty(callState.Request.方法名称))
                {
                    throw LogUtil.ExceptionAndLog(callState, "WCF-HTTP服务的方法名称必须填写", "", binding, request);
                }
                else
                {
                    webRequest.Headers.Add("SOAPAction", String.Format("{0}/{1}", EsbClient.COMPANY_URL, request.方法名称));
                }

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    String reqMessage  = CommonUtil.XmlEncoding(request.消息内容);
                    String soapMessage = String.Format(SOAP_MESSAGE_TEMPLATE, EsbClient.COMPANY_URL, reqMessage);
                    byte[] data        = System.Text.Encoding.Default.GetBytes(soapMessage);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                using (Stream newstream = webResponse.GetResponseStream())
                {
                    using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.Default))
                    {
                        String outString = srRead.ReadToEnd();
                        callState.CallEndTime = DateTime.Now;

                        response.消息内容 = GetMessageFromSOAP(outString, "//" + callState.Request.方法名称 + "Result");
                        srRead.Close();
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState.RequestBeginTime, callState.RequestEndTime, callState.CallBeginTime, callState.CallEndTime
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                {
                    exMessage = ex.InnerException.Message;
                }
                else
                {
                    exMessage = ex.Message;
                }

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return(response);
        }
Example #9
0
        public static ESB.Core.Schema.服务响应 CallAshxService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.服务请求 request = callState.Request;
            String message = callState.Request.消息内容;
            BindingTemplate binding = callState.Binding;
            String uri = callState.Binding.Address;
            String contentType = String.Equals(callState.Request.消息编码, "XML", StringComparison.OrdinalIgnoreCase)
                ? EsbClient.CONTENT_TYPE_XML : EsbClient.CONTENT_TYPE_JSON;

            //--STEP.2.根据method拼接URL
            if (String.IsNullOrEmpty(callState.Request.方法名称))
            {
                throw LogUtil.ExceptionAndLog(callState, "ASHX服务的方法名称必须填写", "", binding, request);
            }
            else
            {
                uri = uri + "?EsbAction=" + callState.Request.方法名称;
            }

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.服务响应 response = new ESB.Core.Schema.服务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept = contentType;
                webRequest.Method = "POST";
                webRequest.ContentType = contentType;

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    byte[] data = System.Text.Encoding.Default.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                using (Stream newstream = webResponse.GetResponseStream())
                {
                    using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.Default))
                    {
                        String outString = srRead.ReadToEnd();
                        callState.CallEndTime = DateTime.Now;

                        response.消息内容 = outString;
                        srRead.Close();
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState.RequestBeginTime, callState.RequestEndTime, callState.CallBeginTime, callState.CallEndTime
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                    exMessage = ex.InnerException.Message;
                else
                    exMessage = ex.Message;

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return response;
        }
Example #10
0
        public static ESB.Core.Schema.务响应 CallWcfService(CallState callState)
        {
            //Console.WriteLine("CallWcfService 开始:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.务请求 request = callState.Request;
            String          message     = callState.Request.消息内容;
            BindingTemplate binding     = callState.Binding;
            String          uri         = callState.Binding.Address;

            callState.Request.方法名称 = GetMethodName(callState.Request.方法名称);

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.务响应 response = new ESB.Core.Schema.务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                //webRequest.Proxy = null;
                webRequest.Method      = "POST";
                webRequest.ContentType = "text/xml; charset=utf-8";
                webRequest.Timeout     = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());
                webRequest.Headers.Add(Constant.ESB_HEAD_ANVOKE_ACTION, callState.Request.方法名称);

                if (String.IsNullOrEmpty(callState.Request.方法名称))
                {
                    throw LogUtil.ExceptionAndLog(callState, "WCF-HTTP服务的方法名称必须填写", "", binding, request);
                }
                else
                {
                    webRequest.Headers.Add("SOAPAction", String.Format("{0}/EsbAction", Constant.COMPANY_URL));
                }


                //Console.WriteLine("WebRequest.Create 完成:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    String reqMessage  = CommonUtil.XmlEncoding(request.消息内容);
                    String esbAction   = request.方法名称;
                    String soapMessage = String.Format(SOAP_MESSAGE_TEMPLATE, Constant.COMPANY_URL, reqMessage);
                    byte[] data        = System.Text.Encoding.UTF8.GetBytes(soapMessage);
                    //Console.WriteLine("webRequest.GetRequestStream 开始:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                    //Console.WriteLine("webRequest.GetRequestStream 完成:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                //--从返回头消息中取到服务调用的时间
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime   = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                //Console.WriteLine("webRequest.GetResponse 完成:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                if (webResponse.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString, "//" + callState.Request.方法名称 + "Result");
                            srRead.Close();
                        }
                    }
                }
                else if (webResponse.ContentEncoding.ToLower().Contains("deflate"))
                {
                    using (DeflateStream stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString, "//" + callState.Request.方法名称 + "Result");
                            srRead.Close();
                        }
                    }
                }
                else
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString, "//" + callState.Request.方法名称 + "Result");
                            srRead.Close();
                        }
                    }
                }
                //Console.WriteLine("CallWcfService 完成:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                //Console.WriteLine("AddAuditLog 开始:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);

                //Console.WriteLine("AddAuditLog 完成:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                {
                    exMessage = ex.InnerException.Message;
                }
                else
                {
                    exMessage = ex.Message;
                }

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return(response);
        }
Example #11
0
        /// <summary>
        /// 利用反射调用目标服务
        /// </summary>
        /// <param name="url"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        internal static ESB.Core.Schema.服务响应 CallWebService(CallState state)
        {
            CallState callState = state as CallState;
            BindingTemplate binding = callState.Binding;
            ESB.Core.Schema.服务请求 request = callState.Request;

            SoapClientItem soapClient = null;

            try
            {
                soapClient = SoapClientCache.GetItem(binding.Address, request.服务名称);
            }
            catch (Exception ex)
            {
                throw LogUtil.ExceptionAndLog(callState, "获取目标服务的代理程序集时发生异常", ex.Message, binding, request);
            }

            if (soapClient != null)
            {
                MethodInfo method = soapClient.GetMethodInfo(request.方法名称);
                if (method == null)
                    throw LogUtil.ExceptionAndLog(callState, "目标服务未实现方法", request.方法名称, binding, request);

                Object req = GetRequest(soapClient, request);
                if (req == null)
                    throw LogUtil.ExceptionAndLog(callState, "无法将请求转换成目标服务所需要的输入参数", "", binding, request);

                Object res = null;
                try
                {
                    callState.CallBeginTime = DateTime.Now;
                    res = method.Invoke(soapClient.PortObject, new Object[] { req });
                    callState.CallEndTime = DateTime.Now;
                }
                catch (Exception ex)
                {
                    callState.CallEndTime = DateTime.Now;

                    String message = String.Empty;
                    if (ex.InnerException != null)
                        message = ex.InnerException.Message;
                    else
                        message = ex.Message;

                    throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", message, binding, request);
                }

                ESB.Core.Schema.服务响应 response = GetResponse(res, method.ReturnType);
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);

                return response;
            }
            else
            {
                throw LogUtil.ExceptionAndLog(callState, "获取目标服务的代理程序集失败!", "", binding, request);
            }
        }
Example #12
0
        /// <summary>
        /// 根据绑定中的协议类型调用不同的实现方法
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        private static ESB.Core.Schema.服务响应 CallService(CallState callState)
        {
            ESBProxy esbProxy = ESBProxy.GetInstance();

            Boolean noCache = false;
            if (callState.InvokeParam != null)
                noCache = (callState.InvokeParam.NoCache == 1);

            //--如果缓存失效时间大于0,则优先从缓存中获取数据
            if (callState.ServiceConfig.CacheDuration > 0)
            {
                String key = String.Format("MBSOA:{0}:{1}:{2}", callState.Request.服务名称, callState.Request.方法名称, DataHelper.Hash(callState.Request.消息内容));

                DateTime callBeginTime = DateTime.Now;
                //--如果noCache为True则强制调用后台服务,刷新缓存
                String message = noCache ? String.Empty : esbProxy.CacheManager.GetCache(key);
                DateTime callEndTime = DateTime.Now;

                if (String.IsNullOrEmpty(message))
                {
                    ESB.Core.Schema.服务响应 res = CallProxy(callState);
                    esbProxy.CacheManager.SetCache(key, res.消息内容, callState.ServiceConfig.CacheDuration);

                    return res;
                }
                else
                {
                    ESB.Core.Schema.服务响应 res = new Schema.服务响应() { 消息内容 = message };
                    callState.CallBeginTime = callBeginTime;
                    callState.CallEndTime = callEndTime;
                    LogUtil.AddAuditLog(1, callState.Binding, callState, message, callState.Request, 1);

                    return res;
                }
            }
            else{
                return CallProxy(callState);
            }
        }
Example #13
0
        public static ESB.Core.Schema.务响应 CallAshxService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.务请求 request = callState.Request;
            String          message     = callState.Request.消息内容;
            BindingTemplate binding     = callState.Binding;
            String          uri         = callState.Binding.Address;
            String          contentType = String.Equals(callState.Request.消息编码, "XML", StringComparison.OrdinalIgnoreCase)
                ? EsbClient.CONTENT_TYPE_XML : EsbClient.CONTENT_TYPE_JSON;

            //--STEP.2.根据method拼接URL
            if (String.IsNullOrEmpty(callState.Request.方法名称))
            {
                throw LogUtil.ExceptionAndLog(callState, "ASHX服务的方法名称必须填写", "", binding, request);
            }
            else
            {
                uri = uri + "?EsbAction=" + callState.Request.方法名称;
            }

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.务响应 response = new ESB.Core.Schema.务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept      = contentType;
                webRequest.Method      = "POST";
                webRequest.ContentType = contentType;

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    byte[] data = System.Text.Encoding.Default.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                using (Stream newstream = webResponse.GetResponseStream())
                {
                    using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.Default))
                    {
                        String outString = srRead.ReadToEnd();
                        callState.CallEndTime = DateTime.Now;

                        response.消息内容 = outString;
                        srRead.Close();
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState.RequestBeginTime, callState.RequestEndTime, callState.CallBeginTime, callState.CallEndTime
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                {
                    exMessage = ex.InnerException.Message;
                }
                else
                {
                    exMessage = ex.Message;
                }

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return(response);
        }
Example #14
0
File: LogUtil.cs Project: vebin/soa
        /// <summary>
        /// 增加审计日志
        /// </summary>
        public static String AddAuditLog(int status
            , String bindingTemplateID
            , String serviceID
            , String address
            , CallState callState
            , String message
            , ESB.Core.Schema.服务请求 request
            , Int32 isCache = 0)
        {
            callState.RequestEndTime = DateTime.Now;
            TimeSpan ReqTimeSpan = callState.RequestEndTime.Subtract(callState.RequestBeginTime);

            ConfigurationManager cm = ConfigurationManager.GetInstance();
            String consumerIP = cm.LocalIP;
            if (callState.InvokeParam != null && !String.IsNullOrWhiteSpace(callState.InvokeParam.ConsumerIP))
                consumerIP = callState.InvokeParam.ConsumerIP;

            Int32 isQueue = 0;
            if (callState.InvokeParam != null)
                isQueue = callState.InvokeParam.IsQueue;

            AuditBusiness log = new AuditBusiness()
            {
                OID = Guid.NewGuid().ToString(),
                HostName = request.主机名称,
                ServiceName = request.服务名称,
                MethodName = request.方法名称,
                ReqBeginTime = callState.RequestBeginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                ReqEndTime = callState.RequestEndTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                Status = status,
                MessageID = callState.MessageID,
                MessageBody = request.消息内容,
                CallBeginTime = callState.CallBeginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                CallEndTime = callState.CallEndTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                BindingTemplateID = bindingTemplateID,
                ServiceID = serviceID,
                BindingAddress = address,
                ReturnMessageBody = message,
                BusinessName = "",
                BusinessID = "",
                ServiceBeginTime = callState.ServiceBeginTime,
                ServiceEndTime = callState.ServiceEndTime,
                TraceID = callState.TraceContext.TraceID,
                InvokeLevel = callState.TraceContext.InvokeLevel,
                InvokeOrder = callState.TraceContext.InvokeOrder,
                InvokeID = callState.TraceContext.InvokeID,
                InvokeTimeSpan = ReqTimeSpan.TotalMilliseconds,
                ConsumerIP = consumerIP,
                Version = callState.ServiceVersion,
                IsCache = isCache,
                IsQueue = isQueue
            };

            //log.Insert();
            //String mqHost = ESBProxy.GetInstance().ESBConfig.Monitor[0].Uri;
            //MSMQUtil.SendMessage<AuditBusiness>(log, String.Format(@"FormatName:DIRECT=TCP:{0}\Private$\EsbAuditQueue", "192.168.56.2"));

            ESBProxy.GetInstance().MessageQueueClient.SendAuditMessage(log);

            //--每调用完一次需要增加调用次数
            callState.TraceContext.IncreaseInvokeOrder();

            return log.OID;
        }
Example #15
0
File: LogUtil.cs Project: vebin/soa
        /// <summary>
        /// 抛出异常并写日志
        /// </summary>
        /// <param name="message"></param>
        /// <param name="binding"></param>
        /// <param name="request"></param>
        public static Exception ExceptionAndLog(String exceptionDesc, String message, BindingTemplate binding, ESB.Core.Schema.服务请求 request)
        {
            CallState state = new CallState()
            {
                RequestBeginTime = DateTime.Now,
                RequestEndTime = DateTime.Now,
                CallBeginTime = DateTime.Now,
                CallEndTime = DateTime.Now
            };

            return ExceptionAndLog(state, exceptionDesc, message, binding, request);
        }
Example #16
0
        /// <summary>
        /// 调用Handler服务
        /// </summary>
        /// <param name="callState"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.务响应 CallAshxService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.务请求 request = callState.Request;
            String          message     = callState.Request.消息内容;
            BindingTemplate binding     = callState.Binding;
            String          uri         = callState.Binding.Address;
            String          contentType = String.Equals(callState.Request.消息编码, "XML", StringComparison.OrdinalIgnoreCase)
                ? Constant.CONTENT_TYPE_XML : Constant.CONTENT_TYPE_JSON;

            callState.Request.方法名称 = GetMethodName(callState.Request.方法名称);


            //--STEP.2.根据method拼接URL
            if (String.IsNullOrEmpty(callState.Request.方法名称))
            {
                throw LogUtil.ExceptionAndLog(callState, "ASHX服务的方法名称必须填写", "", binding, request);
            }

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.务响应 response = new ESB.Core.Schema.务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept      = contentType;
                webRequest.Method      = "POST";
                webRequest.ContentType = contentType;
                webRequest.Timeout     = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add("Accept-Encoding", "gzip");
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());
                webRequest.Headers.Add(Constant.ESB_HEAD_ANVOKE_ACTION, callState.Request.方法名称);

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse     = (HttpWebResponse)webRequest.GetResponse();
                String          contentEncoding = webResponse.ContentEncoding.ToLower();
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime   = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                if (String.IsNullOrEmpty(contentEncoding))
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else if (contentEncoding.Contains("gzip"))
                {
                    using (GZipStream stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else if (contentEncoding.Contains("deflate"))
                {
                    using (DeflateStream stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                {
                    exMessage = ex.InnerException.Message;
                }
                else
                {
                    exMessage = ex.Message;
                }

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return(response);
        }
Example #17
0
        /// <summary>
        /// 调用Handler服务
        /// </summary>
        /// <param name="callState"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.服务响应 CallAshxService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.服务请求 request = callState.Request;
            String message = callState.Request.消息内容;
            BindingTemplate binding = callState.Binding;
            String uri = callState.Binding.Address;
            String contentType = String.Equals(callState.Request.消息编码, "XML", StringComparison.OrdinalIgnoreCase)
                ? Constant.CONTENT_TYPE_XML : Constant.CONTENT_TYPE_JSON;
            callState.Request.方法名称 = GetMethodName(callState.Request.方法名称);


            //--STEP.2.根据method拼接URL
            if (String.IsNullOrEmpty(callState.Request.方法名称))
            {
                throw LogUtil.ExceptionAndLog(callState, "ASHX服务的方法名称必须填写", "", binding, request);
            }

            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.服务响应 response = new ESB.Core.Schema.服务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept = contentType;
                webRequest.Method = "POST";
                webRequest.ContentType = contentType;
                webRequest.Timeout = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add("Accept-Encoding", "gzip");
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());
                webRequest.Headers.Add(Constant.ESB_HEAD_ANVOKE_ACTION, callState.Request.方法名称);

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (!String.IsNullOrEmpty(message))
                {
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                String contentEncoding = webResponse.ContentEncoding.ToLower();
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                if (String.IsNullOrEmpty(contentEncoding))
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else if (contentEncoding.Contains("gzip"))
                {
                    using (GZipStream stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else if (contentEncoding.Contains("deflate"))
                {
                    using (DeflateStream stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }
                else
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = outString;
                            srRead.Close();
                        }
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                    exMessage = ex.InnerException.Message;
                else
                    exMessage = ex.Message;

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return response;
        }
Example #18
0
        public static ESB.Core.Schema.服务响应 CallWebService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.服务请求 request = callState.Request;
            String message = callState.Request.消息内容;
            BindingTemplate binding = callState.Binding;
            String uri = callState.Binding.Address;
            callState.Request.方法名称 = GetMethodName(callState.Request.方法名称);


            //--STEP.3.构造HTTP请求并调用ASHX服务
            ESB.Core.Schema.服务响应 response = new ESB.Core.Schema.服务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Method = "POST";
                webRequest.ContentType = "text/xml; charset=utf-8";
                webRequest.Timeout = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());
                webRequest.Headers.Add(Constant.ESB_HEAD_ANVOKE_ACTION, callState.Request.方法名称);

                if (String.IsNullOrEmpty(callState.Request.方法名称))
                {
                    throw LogUtil.ExceptionAndLog(callState, "WCF-HTTP服务的方法名称必须填写", "", binding, request);
                }
                else
                {
                    webRequest.Headers.Add("SOAPAction", String.Format("{0}/EsbAction", Constant.COMPANY_URL));
                }

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                //if (!String.IsNullOrEmpty(message))
                {
                    String reqMessage = CommonUtil.XmlEncoding(request.消息内容);
                    String esbAction = request.方法名称;
                    String soapMessage = String.Format(SOAP_MESSAGE_TEMPLATE, Constant.COMPANY_URL, reqMessage);
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(soapMessage);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                //--从返回头消息中取到服务调用的时间
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                if (webResponse.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString);
                            srRead.Close();
                        }
                    }
                }
                else if (webResponse.ContentEncoding.ToLower().Contains("deflate"))
                {
                    using (DeflateStream stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress))
                    {
                        using (StreamReader srRead = new StreamReader(stream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString);
                            srRead.Close();
                        }
                    }
                }
                else
                {
                    using (Stream newstream = webResponse.GetResponseStream())
                    {
                        using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                        {
                            String outString = srRead.ReadToEnd();
                            callState.CallEndTime = DateTime.Now;

                            response.消息内容 = GetMessageFromSOAP(outString);
                            srRead.Close();
                        }
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                    exMessage = ex.InnerException.Message;
                else
                    exMessage = ex.Message;

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return response;
        }
Example #19
0
        /// <summary>
        /// 利用反射调用目标服务
        /// </summary>
        /// <param name="url"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        internal static ESB.Core.Schema.务响应 CallWebService(CallState state)
        {
            CallState       callState = state as CallState;
            BindingTemplate binding   = callState.Binding;

            ESB.Core.Schema.务请求 request = callState.Request;

            SoapClientItem soapClient = null;

            try
            {
                soapClient = SoapClientCache.GetItem(binding.Address, request.务名称);
            }
            catch (Exception ex)
            {
                throw LogUtil.ExceptionAndLog(callState, "获取目标服务的代理程序集时发生异常", ex.Message, binding, request);
            }

            if (soapClient != null)
            {
                MethodInfo method = soapClient.GetMethodInfo(request.方法名称);
                if (method == null)
                {
                    throw LogUtil.ExceptionAndLog(callState, "目标服务未实现方法", request.方法名称, binding, request);
                }

                Object req = GetRequest(soapClient, request);
                if (req == null)
                {
                    throw LogUtil.ExceptionAndLog(callState, "无法将请求转换成目标服务所需要的输入参数", "", binding, request);
                }


                Object res = null;
                try
                {
                    callState.CallBeginTime = DateTime.Now;
                    res = method.Invoke(soapClient.PortObject, new Object[] { req });
                    callState.CallEndTime = DateTime.Now;
                }
                catch (Exception ex)
                {
                    callState.CallEndTime = DateTime.Now;

                    String message = String.Empty;
                    if (ex.InnerException != null)
                    {
                        message = ex.InnerException.Message;
                    }
                    else
                    {
                        message = ex.Message;
                    }

                    throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", message, binding, request);
                }

                ESB.Core.Schema.务响应 response = GetResponse(res, method.ReturnType);
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState.RequestBeginTime, callState.RequestEndTime, callState.CallBeginTime, callState.CallEndTime
                    , response.消息内容, request);

                return(response);
            }
            else
            {
                throw LogUtil.ExceptionAndLog(callState, "获取目标服务的代理程序集失败!", "", binding, request);
            }
        }
Example #20
0
        /// <summary>
        /// 调用主流程
        /// </summary>
        /// <param name="callState"></param>
        /// <returns></returns>
        public static ESB.Core.Schema.务响应 CallRestfulService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.务请求 request = callState.Request;
            String          message     = callState.Request.消息内容;
            BindingTemplate binding     = callState.Binding;
            String          uri         = callState.Binding.Address.TrimEnd('/');
            String          contentType = Constant.CONTENT_TYPE_JSON;
            String          method      = "POST";
            String          methodName  = String.Empty;

            String[] methodParams = callState.Request.方法名称.Split(":");
            if (methodParams.Length == 1)
            {
                method      = "POST";
                methodName  = methodParams[0];
                contentType = Constant.CONTENT_TYPE_JSON;
            }
            else if (methodParams.Length == 2)
            {
                method      = methodParams[0];
                methodName  = methodParams[1];
                contentType = Constant.CONTENT_TYPE_JSON;
            }
            else if (methodParams.Length == 3)
            {
                method      = methodParams[0];
                methodName  = methodParams[2];
                contentType = String.Compare("JSON", methodParams[1], true) == 0 ? Constant.CONTENT_TYPE_JSON : Constant.CONTENT_TYPE_XML;
            }

            //contentType = Constant.CONTENT_TYPE_JSON;


            //--STEP.2.根据method拼接URL
            if (method.ToUpper() == "GET")
            {
                message = message.Trim();
                if (message.StartsWith("{"))//--如果参数以大括弧开头,说明是JSON参数,需要转化成QueryString
                {
                    message = JsonToQueryString(message);
                }

                uri = uri + "/" + methodName + "?" + message;
            }
            else
            {
                uri = uri + "/" + methodName;
            }

            //uri = "http://10.100.20.180:8016/" + methodName + "?format=json";
            //uri = "http://localhost:8080/" + methodName;// +"?format=json";

            //--STEP.3.构造HTTP请求并调用RESTful服务
            ESB.Core.Schema.务响应 response = new ESB.Core.Schema.务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept      = contentType;
                webRequest.Method      = method;
                webRequest.ContentType = contentType;
                webRequest.Timeout     = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());


                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (method == "POST" && !String.IsNullOrEmpty(message))
                {
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                //--从返回头消息中取到服务调用的时间
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime   = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                using (Stream newstream = webResponse.GetResponseStream())
                {
                    using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                    {
                        String outString = srRead.ReadToEnd();
                        callState.CallEndTime = DateTime.Now;

                        response.消息内容 = outString;
                        srRead.Close();
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);
            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                {
                    exMessage = ex.InnerException.Message;
                }
                else
                {
                    exMessage = ex.Message;
                }

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return(response);
        }
Example #21
0
File: LogUtil.cs Project: vebin/soa
        /// <summary>
        /// 抛出异常并写日志, 并需要记录异常的时间
        /// </summary>
        /// <param name="message"></param>
        /// <param name="binding"></param>
        /// <param name="request"></param>
        public static Exception ExceptionAndLog(CallState state, String exceptionDesc, String message, BindingTemplate binding, ESB.Core.Schema.服务请求 request)
        {
            String messageID = String.Empty;
            String exceptionMessage = String.Format("{0}:{1}", exceptionDesc, message);


            if (state.CallBeginTime.Year != DateTime.Now.Year) state.CallBeginTime = DateTime.Now;
            if (state.CallEndTime.Year != DateTime.Now.Year) state.CallEndTime = DateTime.Now;

            if (binding != null)
                messageID = AddAuditLog(0, binding, state , exceptionMessage, request);
            else
                messageID = AddAuditLog(0, "00000000-0000-0000-0000-000000000000"
                    , String.Empty, string.Empty, state, exceptionMessage, request);


            ExceptionCoreTb exception = new ExceptionCoreTb()
            {
                ExceptionID = Guid.NewGuid().ToString(),
                BindingTemplateID = binding == null ? "" : binding.TemplateID,
                BindingType = 0,
                Description = exceptionDesc,
                ExceptionCode = String.Empty,
                ExceptionInfo = exceptionMessage,
                ExceptionLevel = 0,
                ExceptionStatus = 0,
                ExceptionTime = DateTime.Now,
                ExceptionType = 0,
                HostName = request.主机名称,
                MessageBody = request.消息内容,
                MessageID = messageID,
                MethodName = request.方法名称,
                RequestPwd = request.密码,
                RequestType = 0
            };

            //exception.Insert();
            ESBProxy.GetInstance().MessageQueueClient.SendExceptionMessage(exception);

            return new Exception(message);
        }
Example #22
0
        public static ESB.Core.Schema.服务响应 CallDubboService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            ESB.Core.Schema.服务请求 request = callState.Request;
            String message = callState.Request.消息内容;
            BindingTemplate binding = callState.Binding;
            String uri = callState.Binding.Address.TrimEnd('/');
            String contentType = Constant.CONTENT_TYPE_JSON;
            String method = "POST";
            String methodName = String.Empty;

            String[] methodParams = callState.Request.方法名称.Split(":");
            if (methodParams.Length == 1)
            {
                method = "POST";
                methodName = methodParams[0];
                contentType = Constant.CONTENT_TYPE_JSON;
            }
            else if (methodParams.Length == 2)
            {
                method = methodParams[0];
                methodName = methodParams[1];
                contentType = Constant.CONTENT_TYPE_JSON;
            }
            else if (methodParams.Length == 3)
            {
                method = methodParams[0];
                methodName = methodParams[2];
                contentType = String.Compare("JSON", methodParams[1], true) == 0 ? Constant.CONTENT_TYPE_JSON : Constant.CONTENT_TYPE_XML;
            }

            //--STEP.2.统一采用POST方法调用Dubbo服务
            if (method.ToUpper() == "GET")
            {
                uri = uri + "?method=" + methodName + "&param=" + HttpUtility.UrlEncode(message);
            }
            else
            {
                uri = uri + "?method=" + methodName;
            }
            contentType = Constant.CONTENT_TYPE_FROM;

            //--STEP.3.构造HTTP请求并调用RESTful服务
            ESB.Core.Schema.服务响应 response = new ESB.Core.Schema.服务响应();
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Accept = contentType;
                webRequest.Method = method;
                webRequest.ContentType = contentType;
                webRequest.Timeout = callState.ServiceConfig.Timeout;
                webRequest.Headers.Add(Constant.ESB_HEAD_TRACE_CONTEXT, callState.TraceContext.ToString());

                message = "param=" + HttpUtility.UrlEncode(message);

                //--STEP.3.1.如果是POST请求,则需要将消息内容发送出去
                if (method == "POST" && !String.IsNullOrEmpty(message))
                {

                    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
                    using (Stream stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                //--STEP.3.2.获取到响应消息
                callState.CallBeginTime = DateTime.Now;
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                //--从返回头消息中取到服务调用的时间
                callState.ServiceBeginTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_BEGIN];
                callState.ServiceEndTime = webResponse.Headers[Constant.ESB_HEAD_SERVICE_END];

                using (Stream newstream = webResponse.GetResponseStream())
                {
                    using (StreamReader srRead = new StreamReader(newstream, System.Text.Encoding.UTF8))
                    {
                        String outString = srRead.ReadToEnd();
                        callState.CallEndTime = DateTime.Now;

                        response.消息内容 = outString;
                        srRead.Close();
                    }
                }

                //--STEP.3.3.记录日志并返回ESB响应
                LogUtil.AddAuditLog(
                    1
                    , binding
                    , callState
                    , response.消息内容, request);

            }
            catch (Exception ex)
            {
                callState.CallEndTime = DateTime.Now;

                String exMessage = String.Empty;
                if (ex.InnerException != null)
                    exMessage = ex.InnerException.Message;
                else
                    exMessage = ex.Message;

                throw LogUtil.ExceptionAndLog(callState, "调用目标服务抛出异常", exMessage, binding, request);
            }

            return response;
        }
Example #23
0
File: LogUtil.cs Project: vebin/soa
 /// <summary>
 /// 增加审计日志
 /// </summary>
 public static String AddAuditLog(int status
     , BindingTemplate binding
     , CallState callState
     , String message
     , ESB.Core.Schema.服务请求 request
     , Int32 isCache = 0)
 {
     return AddAuditLog(status, binding.TemplateID, binding.ServiceID, binding.Address
      , callState
      , message, request, isCache);
 }
Example #24
0
        /// <summary>
        /// 增加审计日志
        /// </summary>
        public static String AddAuditLog(int status
                                         , String bindingTemplateID
                                         , String serviceID
                                         , String address
                                         , CallState callState
                                         , String message
                                         , ESB.Core.Schema.务请求 request
                                         , Int32 isCache = 0)
        {
            callState.RequestEndTime = DateTime.Now;
            TimeSpan ReqTimeSpan = callState.RequestEndTime.Subtract(callState.RequestBeginTime);

            ConfigurationManager cm = ConfigurationManager.GetInstance();
            String consumerIP       = cm.LocalIP;

            if (callState.InvokeParam != null && !String.IsNullOrWhiteSpace(callState.InvokeParam.ConsumerIP))
            {
                consumerIP = callState.InvokeParam.ConsumerIP;
            }

            Int32 isQueue = 0;

            if (callState.InvokeParam != null)
            {
                isQueue = callState.InvokeParam.IsQueue;
            }

            AuditBusiness log = new AuditBusiness()
            {
                OID               = Guid.NewGuid().ToString(),
                HostName          = request.主机名称,
                ServiceName       = request.务名称,
                MethodName        = request.方法名称,
                ReqBeginTime      = callState.RequestBeginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                ReqEndTime        = callState.RequestEndTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                Status            = status,
                MessageID         = callState.MessageID,
                MessageBody       = request.消息内容,
                CallBeginTime     = callState.CallBeginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                CallEndTime       = callState.CallEndTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"),
                BindingTemplateID = bindingTemplateID,
                ServiceID         = serviceID,
                BindingAddress    = address,
                ReturnMessageBody = message,
                BusinessName      = "",
                BusinessID        = "",
                ServiceBeginTime  = callState.ServiceBeginTime,
                ServiceEndTime    = callState.ServiceEndTime,
                TraceID           = callState.TraceContext.TraceID,
                InvokeLevel       = callState.TraceContext.InvokeLevel,
                InvokeOrder       = callState.TraceContext.InvokeOrder,
                InvokeID          = callState.TraceContext.InvokeID,
                InvokeTimeSpan    = ReqTimeSpan.TotalMilliseconds,
                ConsumerIP        = consumerIP,
                Version           = callState.ServiceVersion,
                IsCache           = isCache,
                IsQueue           = isQueue
            };

            //log.Insert();
            //String mqHost = ESBProxy.GetInstance().ESBConfig.Monitor[0].Uri;
            //MSMQUtil.SendMessage<AuditBusiness>(log, String.Format(@"FormatName:DIRECT=TCP:{0}\Private$\EsbAuditQueue", "192.168.56.2"));

            ESBProxy.GetInstance().MessageQueueClient.SendAuditMessage(log);

            //--每调用完一次需要增加调用次数
            callState.TraceContext.IncreaseInvokeOrder();

            return(log.OID);
        }