Esempio n. 1
0
 /// <summary>
 /// 增加审计日志
 /// </summary>
 public static String AddAuditLog(int status
                                  , BindingTemplate binding
                                  , DateTime reqBeginTime
                                  , DateTime reqEndTime
                                  , DateTime callBeginTime
                                  , DateTime callEndTime
                                  , String message
                                  , JN.ESB.Schemas.务请求 request)
 {
     return(AddAuditLog(status, binding.TemplateID.ToString(), binding.ServiceID.ToString(), binding.Address.ToString()
                        , reqBeginTime, reqEndTime, callBeginTime, callEndTime
                        , message, request));
 }
Esempio n. 2
0
        public const String COMPANY_URL = "http://mb.com";//--公司网址,用于SOAP协议中的基地址

        /// <summary>
        /// 动态调用WebService主函数
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static JN.ESB.Schemas.务响应 DynamicalCallWebService(
            Boolean needResponse
            , JN.ESB.Schemas.务请求 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());
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 验证并预处理请求参数
        /// </summary>
        /// <param name="request"></param>
        private static void InvalidRequest(JN.ESB.Schemas.务请求 request)
        {
            if (String.IsNullOrEmpty(request.主机名称))
            {
                throw LogUtil.ExceptionAndLog("主机名称必须填写!", "", request);
            }

            if (String.IsNullOrEmpty(request.务名称))
            {
                throw LogUtil.ExceptionAndLog("服务名称必须填写!", "", request);
            }

            if (String.IsNullOrEmpty(request.方法名称))
            {
                EntityList <BindingTemplate> bindings = GetBindings(request);
                if (bindings == null)
                {
                    throw LogUtil.ExceptionAndLog("方法名称必须填写!", "", request);
                }
                else
                {
                    throw LogUtil.ExceptionAndLog("方法名称必须填写!", "", bindings[0], request);
                }
            }

            //--如果用户没有传递请求时间,或则传入时间无效,则默认为当前时间
            if (request.请求时间.Year != DateTime.Now.Year)
            {
                request.请求时间 = DateTime.Now;
            }


            if (String.IsNullOrEmpty(request.消息内容))
            {
                request.消息内容 = String.Empty;
            }

            if (String.IsNullOrEmpty(request.密码))
            {
                request.密码 = String.Empty;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 根据服务请求获取到对应的URL绑定信息
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        private static EntityList <BindingTemplate> GetBindings(JN.ESB.Schemas.务请求 request)
        {
            String          serviceName = request.务名称;
            BusinessService service     = BusinessService.FindByServiceName(serviceName);

            if (service == null)
            {
                throw LogUtil.ExceptionAndLog(String.Format("服务【{0}】尚未注册!", serviceName), "", request);
            }


            //--查找某个服务下所有启用状态的绑定
            EntityList <BindingTemplate> bings = BindingTemplate.FindAllByServiceID(service.ServiceID);

            if (bings == null || bings.Count == 0)
            {
                throw LogUtil.ExceptionAndLog(String.Format("服务【{0}】尚未绑定任何路由地址!", serviceName), "", request);
            }

            return(bings);
        }
Esempio n. 5
0
        /// <summary>
        /// 增加审计日志
        /// </summary>
        public static String AddAuditLog(int status
                                         , String bindingTemplateID
                                         , String serviceID
                                         , String address
                                         , DateTime reqBeginTime
                                         , DateTime reqEndTime
                                         , DateTime callBeginTime
                                         , DateTime callEndTime
                                         , String message
                                         , JN.ESB.Schemas.务请求 request)
        {
            AuditBusiness log = new AuditBusiness()
            {
                OID               = Guid.NewGuid().ToString(),
                HostName          = request.主机名称,
                ServiceName       = request.务名称,
                MethodName        = request.方法名称,
                ReqBeginTime      = reqBeginTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                ReqEndTime        = reqEndTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                Status            = status,
                MessageID         = Guid.NewGuid().ToString(),
                MessageBody       = request.消息内容,
                CallBeginTime     = callBeginTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                CallEndTime       = callEndTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                BindingTemplateID = bindingTemplateID,
                ServiceID         = serviceID,
                BindingAddress    = address,
                ReturnMessageBody = message,
                BusinessName      = "",
                BusinessID        = ""
            };

            //log.Insert();

            MQUtil.SendMessage <AuditBusiness>(log, @"WIN-02UQME9JGZD\Private$\EsbAuditQueue");

            return(log.MessageID);
        }
Esempio n. 6
0
        /// <summary>
        /// 将请求消息转换成目标服务的输入参数
        /// </summary>
        /// <param name="asm"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        private static Object GetRequest(SoapClientItem soapClient, JN.ESB.Schemas.务请求 request)
        {
            object target = null;

            try
            {
                target = soapClient.CreateRequestObject();
                if (target != null)
                {
                    soapClient.SetReqObjProperty(target, "主机名称", request.主机名称);
                    soapClient.SetReqObjProperty(target, "服务名称", request.务名称);
                    soapClient.SetReqObjProperty(target, "方法名称", request.方法名称);
                    soapClient.SetReqObjProperty(target, "消息内容", request.消息内容);
                    soapClient.SetReqObjProperty(target, "密码", request.密码);
                    soapClient.SetReqObjProperty(target, "请求时间", request.请求时间);
                }
            }
            catch (Exception ex)
            {
                XTrace.WriteLine("构造请求参数失败:" + ex.Message);
            }
            return(target);
        }
Esempio n. 7
0
        public static JN.ESB.Schemas.务响应 CallAshxService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            JN.ESB.Schemas.务请求 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服务
            JN.ESB.Schemas.务响应 response = new JN.ESB.Schemas.务响应();
            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);
        }
Esempio n. 8
0
        /// <summary>
        /// 抛出异常并写日志
        /// </summary>
        /// <param name="message"></param>
        /// <param name="binding"></param>
        /// <param name="request"></param>
        public static Exception ExceptionAndLog(String exceptionDesc, String message, BindingTemplate binding, JN.ESB.Schemas.务请求 request)
        {
            CallState state = new CallState()
            {
                RequestBeginTime = DateTime.Now,
                RequestEndTime   = DateTime.Now,
                CallBeginTime    = DateTime.Now,
                CallEndTime      = DateTime.Now
            };

            return(ExceptionAndLog(state, exceptionDesc, message, binding, request));
        }
Esempio n. 9
0
 /// <summary>
 /// 抛出异常并写日志
 /// </summary>
 /// <param name="message"></param>
 /// <param name="binding"></param>
 /// <param name="request"></param>
 /// <returns></returns>
 public static Exception ExceptionAndLog(String exceptionDesc, String message, JN.ESB.Schemas.务请求 request)
 {
     return(ExceptionAndLog(exceptionDesc, message, null, request));
 }
Esempio n. 10
0
        /// <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, JN.ESB.Schemas.务请求 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.RequestBeginTime, state.RequestEndTime, state.CallBeginTime, state.CallEndTime
                                        , exceptionMessage, request);
            }
            else
            {
                messageID = AddAuditLog(0, "00000000-0000-0000-0000-000000000000"
                                        , String.Empty, string.Empty, state.RequestBeginTime, state.RequestEndTime, state.CallBeginTime, state.CallEndTime
                                        , exceptionMessage, request);
            }


            ExceptionCoreTb exception = new ExceptionCoreTb()
            {
                ExceptionID       = Guid.NewGuid(),
                BindingTemplateID = binding == null ? Guid.Empty : 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         = new Guid(messageID),
                MethodName        = request.方法名称,
                RequestPwd        = request.密码,
                RequestType       = 0
            };

            exception.Insert();

            return(new Exception(message));
        }
Esempio n. 11
0
        /// <summary>
        /// 利用反射调用目标服务
        /// </summary>
        /// <param name="url"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        internal static JN.ESB.Schemas.务响应 CallWebService(CallState state)
        {
            CallState       callState = state as CallState;
            BindingTemplate binding   = callState.Binding;

            JN.ESB.Schemas.务请求 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);
                }

                JN.ESB.Schemas.务响应 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);
            }
        }
Esempio n. 12
0
        public static JN.ESB.Schemas.务响应 CallWcfService(CallState callState)
        {
            //--STEP.1.从CallState中获取到需要的信息
            JN.ESB.Schemas.务请求 request = callState.Request;
            String             message = callState.Request.消息内容;
            BindingTemplate    binding = callState.Binding;
            String             uri     = callState.Binding.Address;

            //--STEP.3.构造HTTP请求并调用ASHX服务
            JN.ESB.Schemas.务响应 response = new JN.ESB.Schemas.务响应();
            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);
        }