Пример #1
0
        /// <summary>
        /// 按应用运行时名称取没被处理的监听的事件。
        /// </summary>
        /// <param name="appRuntimeName">应用运行时名称。</param>
        /// <returns></returns>
        public List <EventDC> GetEventList(string appRuntimeName)
        {
            List <RemoteEventEntity> EventList = new List <RemoteEventEntity>();

            lock (locker)
            {
                EventList = dataPers.GetQueryable <RemoteEventEntity>()
                            .Where(ww => ww.AppRuntimeName == appRuntimeName &&
                                   ww.HandleState == HandleState.Unstarted).ToList();
            }

            List <EventDC> EventDcList = new List <EventDC>();

            foreach (var Event in EventList)
            {
                EventDC aEDc = new EventDC();
                aEDc.EventKey  = Event.EventKey;
                aEDc.EventName = Event.EventName;


                ParameterDC message = new ParameterDC();
                message.JsonValue         = Event.MessageJsonValue;
                message.TypeQualifiedName = Event.MessageTypeQuaName;

                aEDc.Message             = message;
                aEDc.SenderInterfaceName = Event.SenderInterfaceName;
                aEDc.SenderTypeName      = Event.SenderTypeName;

                EventDcList.Add(aEDc);
            }

            return(EventDcList);
        }
Пример #2
0
        /// <summary>
        /// 远程事件的播送方法。
        /// </summary>
        /// <param name="sender">发送者。这个参数用于计算响应者路由但不会发往远程响应端。</param>
        /// <param name="args">参数,参数将传弟到响应端。要发给远程响应端的数据必须放在这个参数中。</param>
        public void CastEvent <T>(object sender, RemoteEventArgs <T> args) where T : class, new()
        {
            Type    senderType = sender.GetType();
            EventDC evData     = new EventDC();

            evData.EventKey = Guid.NewGuid().ToString("N");

            if (senderType.GetEvent(args.EventName) != null || senderType.GetEvent(args.EventName).EventHandlerType.FullName == typeof(RemoteEventHandler <>).FullName)
            {
                evData.EventName = args.EventName;
            }
            else
            {
                throw new Exception("不存在RemoteEventHandler型事件" + evData.EventName);
            }

            Type[]      interfaces           = senderType.GetInterfaces();
            List <Type> inheritInterfaceList = interfaces.Where(ww => (ww.GetMembers().Select(ss => ss.Name)).Contains(args.EventName)).ToList();

            if (inheritInterfaceList.Count != 1)
            {
                throw new Exception("不存在或多于一个事件发送者所继承的接口中声名事件" + evData.EventName);
            }
            else
            {
                evData.SenderInterfaceName = inheritInterfaceList.First().FullName;
            }

            ParameterDC Message = new ParameterDC();

            Message.TypeQualifiedName = args.Message.GetType().AssemblyQualifiedName;
            Message.JsonValue         = ServiceTaker.GetService <IJsonSerializer>().Serialize(args.Message);

            evData.Message        = Message;
            evData.SenderTypeName = senderType.FullName;

            IEventOC evOperation = ServiceTaker.GetRemoteService <IEventOC>();

            evOperation.CastRemoteEvent(evData);
        }
Пример #3
0
        public object RequseteWeb(string apiMapKey, string apiInterfaceName, string methodName, List <object> parameterList, string[] types, string apiUrl = "")
        {
            HttpWebResponse response       = null;
            Stream          streamResponse = null;

            try
            {
                MethodDC theContract = new MethodDC();
                theContract.ApiConfigKey  = apiMapKey;
                theContract.InterfaceName = apiInterfaceName;
                theContract.MethodName    = methodName;
                theContract.TypeArguments = types;

                List <ParameterDC> webParamerList = new List <ParameterDC>();
                foreach (object param in parameterList)
                {
                    ParameterDC aWebParamer = new ParameterDC();
                    aWebParamer.TypeQualifiedName = param.GetType().AssemblyQualifiedName;
                    aWebParamer.JsonValue         = Serializer.Serialize(param);
                    webParamerList.Add(aWebParamer);
                }
                theContract.ParameterList = webParamerList;
                string jsonContract = Serializer.Serialize(theContract);
                //TODO:加密或压缩对jsonContract,密文可根据日期变化。服务端验证密文
                MethodDC vdf = Serializer.Deserialize <MethodDC>(jsonContract);

                byte[] PostData = Encoding.UTF8.GetBytes(jsonContract);

                var watch = new System.Diagnostics.Stopwatch();
                watch.Start();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);
                request.Method      = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.GetRequestStream().Write(PostData, 0, PostData.Length);
                request.ContentType = "text/xml";
                ServicePoint currentServicePoint = request.ServicePoint;
                currentServicePoint.ConnectionLimit = 1000;
                response = (HttpWebResponse)request.GetResponse();

                streamResponse = response.GetResponseStream();

                string strResponse = string.Empty;
                //如果服务端采用了GZIP压缩,则先解压缩。
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream gz = new GZipStream(streamResponse, CompressionMode.Decompress))
                    {
                        using (StreamReader readerGzip = new StreamReader(gz, Encoding.UTF8))
                        {
                            strResponse = readerGzip.ReadToEnd();
                        }
                    }
                }
                else
                {
                    using (StreamReader streamRead = new StreamReader(streamResponse, Encoding.UTF8))
                    {
                        strResponse = streamRead.ReadToEnd();
                    }
                }

                //TODO:解密或解压缩对strResponse
                MethodDC reObj = Serializer.Deserialize <MethodDC>(strResponse);
                watch.Stop();

                //写请求日志,用于跟踪请求的时间和数据大小。
                string writeWebRequestLog = System.Configuration.ConfigurationManager.AppSettings["WriteClientHttpWebRequestLog"];
                if (writeWebRequestLog == null)
                {
                    writeWebRequestLog = "false";
                }
                if (bool.Parse(writeWebRequestLog) && !apiInterfaceName.Contains("DBClientBase"))
                {
                    Task task = Task.Factory.StartNew(() =>
                    {
                        byte[] responseData = Encoding.UTF8.GetBytes(strResponse);
                        var counter         = watch.ElapsedMilliseconds;
                        string Parameters   = "";
                        for (int i = 0; i < theContract.ParameterList.Count; i++)
                        {
                            Parameters += theContract.ParameterList[i].JsonValue + "@";
                        }

                        CountUserData countUserData = new CountUserData
                        {
                            ApiInterfaceName  = apiInterfaceName,
                            ClientComputerIP  = UserProfiles.ClientComputerGuid,
                            UserName          = UserProfiles.UserName,
                            LocationName      = UserProfiles.HospitalName,
                            MethodName        = methodName,
                            CounterTime       = counter,
                            ResponseData      = (responseData.Length / 1024.00).ToString("f0"),
                            OperTime          = DateTime.Now,
                            ParameterContents = Parameters,
                        };
                        Orm.Config.Service.DBClientService.Add <CountUserData>(countUserData);
                    });
                    //string strRequestTimeLog = string.Format(" 诊所:{0} ip地址:{1}  操作人:{2} 操作时间:{3} 接口:{4}调用方法:{5} 请求响应时间:{6}(毫秒) 返回值大小:{7}Kb",
                    //    UserProfiles.LocationName, UserProfiles.ClientComputerGuid,UserProfiles.UserName,DateTime.Now, apiInterfaceName, methodName, counter.ToString(), (responseData.Length / 1024.00).ToString("f0"));
                    //WriteLog(strRequestTimeLog, null);
                }

                if (reObj.Result.HasException)
                {
                    if (reObj.Result.ExceptionState == 1)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "消息", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
                        return(null);
                    }
                    else if (reObj.Result.ExceptionState == 2)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "警告", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
                        return(null);
                    }
                    else if (reObj.Result.ExceptionState == 3)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                        return(null);
                    }
                    else
                    {
                        throw new Exception("Message: " + reObj.Result.ExceptionMessage + "\r\n"
                                            + "Stack: " + reObj.Result.ExceptionStack);
                    }
                }
                else
                {
                    Type relType = Type.GetType(reObj.Result.TypeQualifiedName);

                    object relResult = null;
                    if (relType.Name.ToLower() != "void")
                    {
                        relResult = Serializer.Deserialize(reObj.Result.JsonValue, relType);
                    }
                    return(relResult);
                }
            }
            finally
            {
                if (streamResponse != null)
                {
                    streamResponse.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }
Пример #4
0
        /// <summary>
        /// http请求(行心云)
        /// </summary>
        /// <param name="apiMapKey"></param>
        /// <param name="apiInterfaceName"></param>
        /// <param name="methodName"></param>
        /// <param name="parameterList"></param>
        /// <param name="types"></param>
        /// <param name="apiUrl"></param>
        /// <returns></returns>
        public object HttpRequest(string apiInterfaceName, string methodName, List <object> parameterList, string[] types, string apiUrl = "")
        {
            HttpWebResponse response       = null;
            Stream          streamResponse = null;

            try
            {
                MethodDC transDataClass = new MethodDC();
                transDataClass.ApiConfigKey  = apiInterfaceName;
                transDataClass.InterfaceName = apiInterfaceName;
                transDataClass.MethodName    = methodName;
                transDataClass.TypeArguments = types;

                List <ParameterDC> webParamerList = new List <ParameterDC>();
                foreach (object param in parameterList)
                {
                    ParameterDC aWebParamer = new ParameterDC();
                    aWebParamer.TypeQualifiedName = param.GetType().AssemblyQualifiedName;
                    aWebParamer.JsonValue         = JsonConvert.SerializeObject(param);
                    webParamerList.Add(aWebParamer);
                }
                transDataClass.ParameterList = webParamerList;
                //将要传递的数据序列化成json格式
                string jsonContract = JsonConvert.SerializeObject(transDataClass);
                //TODO:加密或压缩对jsonContract,密文可根据日期变化。服务端验证密文
                MethodDC vdf = JsonConvert.DeserializeObject <MethodDC>(jsonContract);
                //将要传递的json转成byte[]
                byte[] PostData = Encoding.UTF8.GetBytes(jsonContract);

                var watch = new System.Diagnostics.Stopwatch();
                watch.Start();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);
                request.Method      = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.GetRequestStream().Write(PostData, 0, PostData.Length);
                request.ContentType = "text/xml; charset=utf-8";
                ServicePoint currentServicePoint = request.ServicePoint;
                currentServicePoint.ConnectionLimit = 1000;

                response       = (HttpWebResponse)request.GetResponse();
                streamResponse = response.GetResponseStream();

                string strResponse = string.Empty;
                //如果服务端采用了GZIP压缩,则先解压缩。
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream gz = new GZipStream(streamResponse, CompressionMode.Decompress))
                    {
                        using (StreamReader readerGzip = new StreamReader(gz, Encoding.UTF8))
                        {
                            strResponse = readerGzip.ReadToEnd();
                        }
                    }
                }
                else
                {
                    using (StreamReader streamRead = new StreamReader(streamResponse, Encoding.UTF8))
                    {
                        strResponse = streamRead.ReadToEnd();
                    }
                }

                //TODO:解密或解压缩对strResponse
                MethodDC reObj = JsonConvert.DeserializeObject <MethodDC>(strResponse);
                watch.Stop();

                //写请求日志,用于跟踪请求的时间和数据大小。
                string writeWebRequestLog = System.Configuration.ConfigurationManager.AppSettings["WriteClientHttpWebRequestLog"];
                if (writeWebRequestLog == null)
                {
                    writeWebRequestLog = "false";
                }
                if (bool.Parse(writeWebRequestLog) && watch.ElapsedMilliseconds > 1000)
                {
                    byte[] responseData      = Encoding.UTF8.GetBytes(strResponse);
                    var    counter           = watch.ElapsedMilliseconds;
                    string strRequestTimeLog = string.Format(" 接口:{0} 调用方法:{1} 请求响应时间:{2}(毫秒) 返回值大小:{3}Kb", apiInterfaceName, methodName, counter.ToString(), (responseData.Length / 1024.00).ToString("f0"));
                    WriteLog(strRequestTimeLog, null);
                }

                if (reObj.Result.HasException)
                {
                    if (reObj.Result.ExceptionState == 1)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "消息", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
                        return(null);
                    }
                    else if (reObj.Result.ExceptionState == 2)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "警告", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
                        return(null);
                    }
                    else if (reObj.Result.ExceptionState == 3)
                    {
                        System.Windows.Forms.MessageBox.Show(reObj.Result.ExceptionMessage, "错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                        return(null);
                    }
                    else
                    {
                        throw new Exception("Message: " + reObj.Result.ExceptionMessage + "\r\n"
                                            + "Stack: " + reObj.Result.ExceptionStack);
                    }
                }
                else
                {
                    Type relType = Type.GetType(reObj.Result.TypeQualifiedName);

                    object relResult = null;
                    if (relType.Name.ToLower() != "void")
                    {
                        relResult = JsonConvert.DeserializeObject(reObj.Result.JsonValue, relType);
                    }
                    return(relResult);
                }
            }
            finally
            {
                if (streamResponse != null)
                {
                    streamResponse.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }
Пример #5
0
        public string RequestService <T>(RequestModel requestModel, List <String> lstTbName)
        {
            HttpWebResponse response       = null;
            Stream          streamResponse = null;

            try
            {
                MethodDC transDataClass = new MethodDC();
                transDataClass.ApiConfigKey  = requestModel.IServiceName;
                transDataClass.InterfaceName = requestModel.IServiceName;
                transDataClass.MethodName    = requestModel.MethodName;
                transDataClass.TypeArguments = requestModel.Types;
                List <ParameterDC> webParamerList = new List <ParameterDC>();
                foreach (object param in requestModel.ParameterList)
                {
                    ParameterDC aWebParamer = new ParameterDC();
                    aWebParamer.TypeQualifiedName = param.GetType().AssemblyQualifiedName;
                    aWebParamer.JsonValue         = JsonConvert.SerializeObject(param);
                    webParamerList.Add(aWebParamer);
                }
                transDataClass.ParameterList = webParamerList;

                if (lstTbName != null)
                {
                    foreach (var strName in lstTbName)
                    {
                        foreach (var item in transDataClass.ParameterList)
                        {
                            if (item.TypeQualifiedName.Contains(strName))
                            {
                                if (item.TypeQualifiedName.Contains(string.Format("HisPlus.Contract.Messages.{0}, HisPlus.Contract, Version=0.0.0.0,", strName)))
                                {
                                    item.TypeQualifiedName = item.TypeQualifiedName.Replace(string.Format("HisPlus.Contract.Messages.{0}, HisPlus.Contract, Version=0.0.0.0,", strName), string.Format("Orm.Model.{0}, Orm.Model, Version=1.0.0.0,", strName.Replace("Dto", string.Empty)));
                                }
                                if (item.TypeQualifiedName.Contains(string.Format("HisPlus.Contract.Messages.Generated.{0}, HisPlus.Contract, Version=0.0.0.0,", strName)))
                                {
                                    item.TypeQualifiedName = item.TypeQualifiedName.Replace(string.Format("HisPlus.Contract.Messages.Generated.{0}, HisPlus.Contract, Version=0.0.0.0,", strName), string.Format("Orm.Model.{0}, Orm.Model, Version=1.0.0.0,", strName.Replace("Dto", string.Empty)));
                                }
                            }
                        }
                    }
                }


                //将要传递的数据序列化成json格式
                string jsonContract = JsonConvert.SerializeObject(transDataClass);
                //TODO:加密或压缩对jsonContract,密文可根据日期变化。服务端验证密文
                MethodDC vdf = JsonConvert.DeserializeObject <MethodDC>(jsonContract);
                //将要传递的json转成byte[]
                byte[] PostData = Encoding.UTF8.GetBytes(jsonContract);

                var watch = new System.Diagnostics.Stopwatch();
                watch.Start();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestModel.ApiUrl);//http://localhost:6848/Handler.api
                request.Method      = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.GetRequestStream().Write(PostData, 0, PostData.Length);
                request.ContentType = "text/xml; charset=utf-8";
                ServicePoint currentServicePoint = request.ServicePoint;
                currentServicePoint.ConnectionLimit = 1000;

                response       = (HttpWebResponse)request.GetResponse();
                streamResponse = response.GetResponseStream();

                string strResponse = string.Empty;
                //如果服务端采用了GZIP压缩,则先解压缩。
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream gz = new GZipStream(streamResponse, CompressionMode.Decompress))
                    {
                        using (StreamReader readerGzip = new StreamReader(gz, Encoding.UTF8))
                        {
                            strResponse = readerGzip.ReadToEnd();
                        }
                    }
                }
                else
                {
                    using (StreamReader streamRead = new StreamReader(streamResponse, Encoding.UTF8))
                    {
                        strResponse = streamRead.ReadToEnd();
                    }
                }

                //TODO:解密或解压缩对strResponse
                MethodDC reObj = JsonConvert.DeserializeObject <MethodDC>(strResponse);
                watch.Stop();

                if (reObj.Result.HasException)
                {
                    throw new Exception("Message: " + reObj.Result.ExceptionMessage + "\r\n"
                                        + "Stack: " + reObj.Result.ExceptionStack);
                }
                else
                {
                    return(reObj.Result.JsonValue);
                }
            }
            finally
            {
                if (streamResponse != null)
                {
                    streamResponse.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }