Ejemplo n.º 1
0
        //Вход программы
        static void Main(string[] args)
        {
            int    _port             = 80;                             //HTTP порт по умолчанию
            int    _max_thread_count = Environment.ProcessorCount * 4; //Максимальное количество потоков по умолчанию = количество ядер * 4
            string _database_file;

            //Получаем имя базы данных (первый параметр)
            if (args.Length < 1)
            {
                Console.WriteLine("no database specified");
                return;
            }
            else
            {
                _database_file = args[0];
                //Если файл или таблица не существует - создаем
                try {
                    OrganizationDB.CreateDataBaseFileIfNotExists(_database_file);
                    OrganizationDB.CreateOrganizationTableIfNotExists(_database_file);
                }
                catch (Exception exc)
                {
                    Console.WriteLine(string.Format("error creating database file or table: {0}", exc.Message));
                    return;
                }
            }

            //Получаем порт из аргументов командной строки, если он задан
            if (args.Length > 1 && !int.TryParse(args[1], out _port))
            {
                Console.WriteLine("not a valid port number");
                return;
            }
            //Получаем макс число потоков из аргументов командной строки, если оно задано
            //Проверям чтобы оно было не меньше числа ядер, т.к. TreadPool требует чтобы их было >=
            if (args.Length > 2 && (!int.TryParse(args[2], out _max_thread_count) || _max_thread_count < Environment.ProcessorCount))
            {
                Console.WriteLine(string.Format("not a valid thread count, or thread count < {0} (current processor count)", Environment.ProcessorCount));
                return;
            }
            //Проверяем на допустимость использования HttpListener
            if (!HttpListener.IsSupported)
            {
                Console.WriteLine("Needs Windows XP SP2, Server 2003 or later");
                return;
            }

            //Создаем и запускаем сервер
            HttpServer server = new HttpServer(_database_file, _port, _max_thread_count);

            server.Start();
        }
Ejemplo n.º 2
0
        //Обработка запроса
        private void ProcessRequest(HttpListenerContext context)
        {
            var responce = new ServerResponce();

            try
            {
                //Читаем текст запроса
                var reader         = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding);
                var request_string = reader.ReadToEnd();
                Console.Write(string.Format("\n>>Request: {0}", request_string));

                //Thread.Sleep(10000);

                //Десериализуем поступивший JSON в объект ClientRequest
                var request = JsonConvert.DeserializeObject <ClientRequest>(request_string);

                //Поиск в базе (тип == 1)
                if (request.type == 1)
                {
                    //Cоздаем подключение и составляем запрос в зависимости от полученных параметров
                    var con        = OrganizationDB.CreateAndOpenConnection(database_path);
                    var query      = "SELECT inn, name FROM organization ";
                    var parameters = new Dictionary <string, object>();
                    if (request.inn != -1 && request.name != "")
                    {
                        query += "WHERE inn LIKE @INN AND name LIKE @NAME";
                        parameters["@INN"]  = "%" + request.inn.ToString() + "%";
                        parameters["@NAME"] = "%" + request.name + "%";
                    }
                    else if (request.inn != -1)
                    {
                        query += "WHERE inn LIKE @INN";
                        parameters["@INN"] = "%" + request.inn.ToString() + "%";
                    }
                    else if (request.name != "")
                    {
                        query += "WHERE name LIKE @NAME";
                        parameters["@NAME"] = "%" + request.name + "%";
                    }

                    var db_reader = OrganizationDB.Query(con, database_path, query, parameters);

                    if (!db_reader.HasRows)
                    {
                        responce.response_text = "Не найдено организаций с указанными параметрами";
                    }
                    else
                    {
                        responce.response_text = "Найденные организации:";
                        while (db_reader.Read())
                        {
                            responce.response_text += string.Format("\nИНН: {0}, Название: {1}", db_reader["inn"], db_reader["name"]);
                        }
                    }
                    db_reader.Close();
                    con.Close();
                }
                //Добавление новой организации
                else
                {
                    if (request.inn > 9999999999)
                    {
                        responce.response_text = "Ошибка: ИНН не должен превышать 10 цифр";
                    }
                    else
                    {
                        OrganizationDB.AddOrganization(database_path, request.inn, request.name);
                        responce.response_text = "Организация успешно создана";
                    }
                }
            }
            catch (Exception exc)
            {
                responce.response_text = string.Format("Ошибка на сервере: {0}", exc.Message);
            }
            finally
            {
                //Отправляем ответ
                byte[] b = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(responce));
                context.Response.ContentLength64 = b.Length;
                context.Response.ContentEncoding = Encoding.UTF8;
                context.Response.OutputStream.Write(b, 0, b.Length);
                context.Response.Close();

                lock (current_requests) current_requests.Remove(context);
            }
        }