private string ProcessFormattedRequestBalance(List <HttpParameter> ptrs) { if (ptrs.Count != 1 || ptrs[0] is ChangeAccountBalanceQuery == false) { return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = false, Comment = "Список параметров (JSON) - ожидается один параметр типа ChangeAccountBalanceQuery" } })); } var queryPtr = (ChangeAccountBalanceQuery)ptrs[0]; // пополнить счет или произвести списания var status = accountRepository.ChangeBalance(queryPtr.AccountId, queryPtr.Amount, queryPtr.Description, queryPtr.ValueDate, queryPtr.ChangeType); return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = status == RequestStatus.OK, Comment = EnumFriendlyName <RequestStatus> .GetString(status) } })); }
private static void RenderSupportedQueries(StringBuilder sb) { sb.AppendLine(" <a href=\"?\">На главную</a>"); sb.AppendLine(" <br/>"); sb.AppendLine(" <h2>Сервер обрабатывает следующие запросы:</h2>"); var samples = new Dictionary <HttpParameter, string> { { new RegisterAccountQuery { Balance = 25000, Currency = "USD", Group = "Demo", MaxLeverage = 100.5f, UserDescription = "UserTitle", UserEmail = "*****@*****.**", UserLogin = "******", UserName = "******", UserPassword = "******", UserPatronym = "User Patronym", UserPhone1 = "8 800 600 50 60", UserPhone2 = "8 800 600 50 61", UserRightsMask = UserAccountRights.Trade, UserRoleMask = UserRole.Trader, UserSurname = "User Surname" }, "<h3>Регистрация пользователя / счета</h3> http://serverurl:port?formatquery=1&register=1, HTTP POST" }, { new ChangeAccountBalanceQuery { AccountId = 3, ChangeType = BalanceChangeType.Deposit, Amount = 0.15M, ValueDate = DateTime.Now }, "<h3>Пополнение/списание со счета</h3> http://serverurl:port?formatquery=1&balance=1, HTTP POST" } }; foreach (var sample in samples) { sb.AppendLine(" " + sample.Value); sb.AppendLine(" <br/> <b>Содержание запроса - JSON-массив вида</b> </br>"); sb.AppendLine(" <p style=\"width:90%\">"); sb.Append(HttpUtility.HtmlEncode(HttpParameter.SerializeInJSon( new List <HttpParameter> { sample.Key }))); sb.AppendLine("</p>"); // допустимые значения перечислений foreach (var pi in sample.Key.GetType().GetProperties()) { if (pi.PropertyType.IsEnum) { sb.AppendLine(" <span>" + MakeEnabledPropertyValuesString(pi) + "</span> <br/>"); } } } }
private string GetServiceStateJSon() { var srvStatus = ServiceProcessManager.GetProcessesStates(); if (srvStatus.Count == 0) { return(string.Empty); } return(HttpParameter.SerializeInJSon(srvStatus.Cast <HttpParameter>().ToList())); }
//private static string FormatPropertyValue(PropertyInfo pi, object sample) //{ // var val = pi.GetValue(sample, null); // if (val == null) return "null"; // if (pi.PropertyType == typeof (DateTime) || // Nullable.GetUnderlyingType(pi.PropertyType) == typeof (DateTime)) // return "'\\/Date(" + (long)((DateTime)val - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds + "+" // + TimeZoneInfo.Local.BaseUtcOffset.Hours.ToString("D2") // + TimeZoneInfo.Local.BaseUtcOffset.Minutes.ToString("D2") + ")\\/'".Replace("+-", "-"); // var omitQuotes = IsNumericType(pi.PropertyType); // return omitQuotes // ? Converter.GetStringFromObject(val) // : "'" + Converter.GetStringFromObject(val) + "'"; //} //private static readonly HashSet<Type> numericTypes = new HashSet<Type> //{ // typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(float), typeof(double), typeof(decimal) //}; //internal static bool IsNumericType(Type type) //{ // return numericTypes.Contains(type) || // numericTypes.Contains(Nullable.GetUnderlyingType(type)); //} /// <summary> /// вернуть true если дальнейшая обработка запроса не требуется /// </summary> private static bool ProcessQueryString(NameValueCollection query, out string resp) { resp = string.Empty; if (query.AllKeys.Contains("reset")) { ResetServiceState(); return(false); } // вернуть сессии пользователей if (query.AllKeys.Contains("current_session")) { var sessions = UserSessionStorage.Instance.GetSessions(); var userInfos = sessions.Select(s => new TerminalUser { IP = s.ip, Login = s.login, Account = s.accountId }).Cast <HttpParameter>().ToList(); resp = HttpParameter.SerializeInJSon(userInfos); return(true); } if (query.AllKeys.Contains("sendMessage") && query.AllKeys.Contains("terminal")) { var msg = query["sendMessage"]; var terminal = query["terminal"].ToLongSafe() ?? 0; Logger.InfoFormat("Command send message (\"{0}\" to {1})", msg, terminal); SendMessageToTerminal(msg, terminal); return(true); } if (query.AllKeys.Contains("logoutUser")) { var terminal = query["logoutUser"].ToLongSafe() ?? 0; Logger.InfoFormat("Logout user {0}", terminal); UserSessionStorage.Instance.ExcludeStaleSessions(new List <long> { terminal }); return(true); } return(false); }
public void Serialization() { var time = DateTime.Now; var objects = new List <HttpParameter> { new TradeSharpServiceProcess { FileName = "TradeSharp.SiteBridge", Name = "SiteBridge", Title = "Мост Web-сервиса" }, new TradeSharpServiceProcess { FileName = "TradeSharp.Quote", Name = "Quote", Title = "Котировки" }, new TradeSharpServiceStartStop { ShouldStart = true, SrvName = "TradeSharp.SiteBridge" }, new ExecutionReport { Comment = "not OK", IsOk = false }, new TerminalUser { Account = 100, IP = "198.15.12.45", Login = "******" }, new ChangeAccountBalanceQuery { AccountId = 3, ChangeType = BalanceChangeType.Deposit, Amount = 0.15M, ValueDate = time } }; var str = HttpParameter.SerializeInJSon(objects); var objs = HttpParameter.DeserializeFromJSon(str); Assert.IsNotNull(objs); Assert.AreEqual(objs.Count, objects.Count); Assert.IsFalse(objects.Select(o => o.ToString()).Except(objs.Select(o => o.ToString())).Any()); }
private static string ProcessFormattedRequestRegister(List <HttpParameter> ptrs) { if (ptrs.Count != 1 || ptrs[0] is RegisterAccountQuery == false) { return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = false, Comment = "Список параметров (JSON) - ожидается один параметр типа RegisterAccountQuery" } })); } var queryPtr = (RegisterAccountQuery)ptrs[0]; var status = ManagerAccount.Instance.RegisterAccount( new PlatformUser { Login = queryPtr.UserLogin, Password = queryPtr.UserPassword, Name = queryPtr.UserName, Surname = queryPtr.UserSurname, Patronym = queryPtr.UserPatronym, Description = queryPtr.UserDescription, Title = queryPtr.UserLogin, Email = queryPtr.UserEmail, Phone1 = queryPtr.UserPhone1, Phone2 = queryPtr.UserPhone2, RegistrationDate = DateTime.Now, RightsMask = queryPtr.UserRightsMask, RoleMask = queryPtr.UserRoleMask }, queryPtr.Currency, (int)queryPtr.Balance, (decimal)queryPtr.MaxLeverage, queryPtr.UserPassword, // пароль задан заранее, автоматом не сочиняем false); // не подписывать автоматом на торговые сигналы лучших в мире трейдеров return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = status == AccountRegistrationStatus.OK, Comment = EnumFriendlyName <AccountRegistrationStatus> .GetString(status) } })); }
/// <summary> /// параметры запроса переданы в формате JSON /// /// возвращает ответ, сериализованный в JSON /// если параметры запроса не прочитаны - вернуть состояние всех сервисов /// иначе - выполнить действие /// </summary> private string ProcessFormattedHttpRequest(HttpListenerContext context) { using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding)) { var text = reader.ReadToEnd(); if (string.IsNullOrEmpty(text)) { return(GetServiceStateJSon()); } var ptrs = HttpParameter.DeserializeFromJSon(text); if (ptrs.Count == 0) { return(GetServiceStateJSon()); } // остановить / запустить сервис if (ptrs[0] is TradeSharpServiceStartStop) { var cmd = (TradeSharpServiceStartStop)ptrs[0]; var report = new ExecutionReport(); if (cmd.ShouldStart) { var status = ServiceProcessManager.StartProcess(cmd.SrvName); report.IsOk = status == ServiceProcessManager.StartProcessStatus.OK; report.Comment = status.ToString(); } else { var status = ServiceProcessManager.KillProcess(cmd.SrvName); report.IsOk = status == ServiceProcessManager.KillProcessStatus.OK; report.Comment = status.ToString(); } return(HttpParameter.SerializeInJSon(new List <HttpParameter> { report })); } } return(GetServiceStateJSon()); }
private string ProcessFormattedHttpRequest(HttpListenerContext context) { using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding)) { var text = reader.ReadToEnd(); if (string.IsNullOrEmpty(text)) { return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = false, Comment = "Список параметров (JSON) пуст" } })); } var ptrs = HttpParameter.DeserializeFromJSon(text); if (ptrs.Count == 0) { return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = false, Comment = "Список параметров (JSON) - ошибка десериализации" } })); } if (context.Request.QueryString.AllKeys.Contains("register")) { return(ProcessFormattedRequestRegister(ptrs)); } if (context.Request.QueryString.AllKeys.Contains("balance")) { return(ProcessFormattedRequestBalance(ptrs)); } } return(HttpParameter.SerializeInJSon(new List <HttpParameter> { new ExecutionReport { IsOk = false, Comment = "Запрос не поддерживается" } })); }