//Вход программы 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(); }
//Обработка запроса 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); } }