Файл: Методические указания по практическим работам для обучающихся пи (филиала) дгту в г. Таганроге по специальности (направлению) 09. 02. 07 Информационные системы м программирование.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 383

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

В данном случае нет необходимости в создании клиентской части на JavaScript и добавлении ссылки на неё в Представление. Использование ModelClientValidationStringLengthRule()позволяет использовать уже готовые адаптер и реализацию алгоритма проверки длины строки.

Стоит отметить, что использование готовых правил позволяет избежать их двойного применения к объекту. Дело в том, что атрибуты с одинаковыми стандартными правилами будут использовать их одинаковые имена. А это привет к ошибке в момент обращения к Представлению на этапе выполнения.

Классы ASP.NET MVC для стандартных правил

  • ModelClientValidationEqualToRule – устанавливает равенство значений текущего и указанного поля.

  • ModelClientValidationRangeRule – определяет минимальное и максимальное значения свойства.

  • ModelClientValidationRegexRule – проверяет значение на соответствие регулярному выражению. Используется стандартным атрибутом [RegularExpression].

  • ModelClientValidationRemoteRule – используется для удаленной проверки данных. Используется стандартным ASP.MET MVC 3 атрибутом [Remote].

  • ModelClientValidationRequiredRule – указывает что данное поле обязательно к заполнению. Используется стандартным атрибутом [Required].

  • ModelClientValidationStringLengthRule – ограничивает длину заданной строки.

Осталась только одна проверка, выполняемая только на сервере. Это тест на уникальность выбранного имени входа на сайт. И опять для данного значения будет использован свой подход. Но перед тем как приступить к реализации, посмотрим на стандартные адаптеры ASP.NET MVC 3 для jQuery Validation.

Задание

Провести проверку на стороне любого кода JavaScript.

Практическая работа № 9 «Проверки на стороне сервера»

Цель: - научиться проводить проверки на стороне сервера

Форма отчета:

−выполнить задание;

−показать преподавателю;

−ответить на вопросы преподавателя.

Время выполнения: 2 ч
Есть клиент и есть сервер, общаются по именованому каналу (named pipe) Проблема: нужно сделать так чтобы сервер после записи данных в поток проверял прочитал ли их клиент и если не прочитал то давал ему на это время (допустим 500 мс, думаю этого достаточно) и если за это время клиент так и не считал данные то сервер разрывал подключение дабы поток не простаивал в ожидании. Проблема в том что просто запись в поток всегда ждёт пока клиент завершит чтение (хоть он там и пол часа висеть будет и не захочет читать с потока данные), а асинхронная запись происходит сразу же и не даёт никакого доп. времени клиенту на чтение. Из тех методов что нашёл у NamedPipeServerStream есть: pipeServer.WaitForPipeDrain(); - никакого толку, ждёт завершение всех операций, те по сути считай что асинхронная запись превратилась в синхронную и опять возможен висяк потока на долгое время WriteTimeout / ReadTimeout; - тоже никакого толку так как выбрасывается исключение что NamedPipeServerStream не поддерживает таких вещей. Ещё конечно же остался вариант в сервере после записи данных написать:


  1.                     if(pipeServer.IsConnected)

  2.                         Thread.Sleep(500);

Но это точно же не выход так как сервер будет точно висеть 500 мс, а клиент то может и через 10 мс уже давно всё считал с потока и его нужно было давным-давно закрыть. Как в таких случаях поступают подскажите пожалуйста, ато сам я решение найти не смог. Код моего сервера и клиента (асинхронные операции не используются пока что). Моя обёртка через которую происходит чтение и запись в поток при общении между клиентом и сервером:

Копировать

  1. //класс для работы с потоком

  2. //Позволяет писать пары логин-пароль и считывать результаты их обработки

  3. class StreamRW

  4. {

  5.     private Stream ioStream;//поток куда писать данные

  6.  

  7.     public StreamRW(Stream stream)

  8.     { ioStream = stream; }

  9.  

  10.     //запись пары логин-пароль в поток

  11.     public void WriteData(Tuple data)

  12.     {

  13.         byte[] outBuffer;

  14.         using (MemoryStream m = new MemoryStream())

  15.         using (BinaryWriter writer = new BinaryWriter(m))

  16.         {

  17.             writer.Write(data.Item1);

  18.             writer.Write(data.Item2);

  19.             outBuffer = m.ToArray();

  20.         }

  21.         int len = outBuffer.Length;

  22.         ioStream.WriteByte((byte)(len / 256));

  23.         ioStream.WriteByte((byte)(len & 255));

  24.         ioStream.Write(outBuffer, 0, len);

  25.         ioStream.Flush();

  26.     }

  27.  

  28.     //чтение пары логин-пароль из потока

  29.     public Tuple ReadData()

  30.     {

  31.         Tuple result;

  32.         int len;

  33.         len = ioStream.ReadByte() * 256;

  34.         len += ioStream.ReadByte();

  35.         byte[] inBuffer = new byte[len];

  36.         ioStream.Read(inBuffer, 0, len);

  37.         using (MemoryStream m = new MemoryStream(inBuffer))

  38.         using (BinaryReader reader = new BinaryReader(m))

  39.         {

  40.             try

  41.             {

  42.                 result = new Tuple(reader.ReadString(), reader.ReadString());

  43.             }

  44.             catch (IOException ex)

  45.             {

  46.                 Console.WriteLine("Error has occured :(\n" +

  47.                     "If you'd like to know more, you can google it:" + ex.Message);

  48.                 result = new Tuple("Error", "Error");

  49.             }

  50.         }

  51.         return result;

  52.     }

  53.  

  54.     //запись кода результата обработки

  55.     public void WriteInt(int answer)

  56.     {

  57.         byte[] outBuffer = new byte[1] { Convert.ToByte(answer) };

  58.         ioStream.Write(outBuffer, 0, 1);

  59.         ioStream.Flush();

  60.     }

  61.  

  62.     //чтение кода результата обработки (если соединение разорвано на стороне сервера то вернёт -1).

  63.     //Исключение выброшено не будет даже если поток закрыт!

  64.     public int ReadInt()

  65.     {

  66.         return Convert.ToInt32(ioStream.ReadByte());

  67.     }

  68. }


Сервер:

Копировать

  1.  private static void ServerThread(object data)

  2.         {

  3.             //создаём именованный канал

  4.             NamedPipeServerStream pipeServer =

  5.                 new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);

  6.  

  7.             //пара логин-пароль для получения инфо от клиента

  8.             Tuple logpass;

  9.  

  10.             //получим ID (просто для вывода на экран, больше не используется)

  11.             int threadId = Thread.CurrentThread.ManagedThreadId;

  12.  

  13.             //сделаем вечный цикл чтобы сервер работал постоянно (ну почти постоянно)

  14.             while (true)

  15.             {

  16.                 //подождём подключения

  17.                 pipeServer.WaitForConnection();

  18.                 //когда клиент подключился выведем уведомление об этом

  19.                 Console.WriteLine("Client connected on thread[{0}].", threadId);

  20.                 try

  21.                 {

  22.                     //настроим обёртку на канал

  23.                     StreamRW srw = new StreamRW(pipeServer);

  24.  

  25.                     //получим связку логин-пароль

  26.                     logpass = srw.ReadData();

  27.  

  28.                     //покажем их на экран

  29.                     Console.WriteLine("Get from client on thread[{0}]: " + logpass.Item1 + " " + logpass.Item2, threadId);

  30.  

  31.                     //отправим ответ клиенту

  32.                     srw.WriteInt(1);

  33.  

  34.                     //выведем инфо что клиент отключился

  35.                     Console.WriteLine("Client on thread[{0}] disconnected.", threadId);

  36.                 }

  37.                 catch (IOException e)

  38.                 {

  39.                     Console.WriteLine("ERROR: {0}", e.Message);

  40.                 }

  41.                 //отсоединить клиента ибо нефиг тут висеть

  42.                 pipeServer.Disconnect();

  43.             }

  44.             pipeServer.Close();

  45.         }

Клиент:

Копировать

  1.             {

  2.                 NamedPipeClientStream pipeClient =

  3.                     new NamedPipeClientStream(".", "testpipe",

  4.                         PipeDirection.InOut, PipeOptions.None,

  5.                         TokenImpersonationLevel.Impersonation);

  6.  

  7.                 Console.WriteLine("Connecting to server...\n");

  8.                 pipeClient.Connect();

  9.  

  10.                 //настроить обёртку на канал

  11.                 StreamRW srw = new StreamRW(pipeClient);

  12.  

  13.                 //записать связку логин-пароль в поток

  14.                 srw.WriteData(new Tuple("login","password"));

  15.  

  16.                 //"зависнуть" на 5секунд чтобы продемонстрировать что сервер всё это время тоже висит и ничего не делает

  17.                 //в ожидании пока клиент не считает ответ  об обработке данных (число int)

  18.                 Thread.Sleep(5000);

  19.  

  20.                 //вывести ответ от сервера

  21.                 Console.Write(srw.ReadInt());

  22.  

  23.                 pipeClient.Close();

  24.                 // Give the client process some time to display results before exiting.

  25.                 Thread.Sleep(4000);

  26.             }


Практическая работа № 10 «Настройки доступа к репозиторию»

Цель: - научиться настраивать доступ к репозиторию

Форма отчета:

−выполнить задание;

−показать преподавателю;

−ответить на вопросы преподавателя.

Время выполнения: 2 ч

Работа со списком репозиториев в настольном приложении

Список репозиториев формируется на вкладке «Репозитории» диалога «Параметры».

Для открытия диалога «Параметры»



  • Для подключения репозитория с сервера СУБД нажмите кнопку «Добавить» и укажите параметры создаваемого репозитория

  • Для редактирования параметров выбранного репозитория:

    • нажмите кнопку «Редактировать»;

    • выполните команду контекстного меню «Редактировать»;

    • дважды щёлкните по репозиторию в списке;

    • нажмите клавишу ENTER.

  • Для удаления выбранных репозиториев из списка:

    • нажмите кнопку «Удалить»;

    • выполните команду контекстного меню «Удалить»;

    • нажмите клавишу DELETE.

Поле «Репозиторий по умолчанию» предназначено для выбора репозитория, который будет отображаться по умолчанию при запуске «Форсайт. Аналитическая платформа».

Задание

Установить доступ к репозиторию на своем ПК.

Практическая работа № 11 «Использование метрик программного продукта»

Цель: - научиться использовать метрик программного продукта

Форма отчета:

−выполнить задание;

−показать преподавателю;

−ответить на вопросы преподавателя.

Время выполнения: 2 ч
В настоящее время в программной инженерии еще не сформировалась окончательно система метрик. Действуют разные подходы к определению их набора и методов измерения. Система измерения включает метрики и модели измерений, которые используются для количественной оценки качества ПО.

При определении требований к ПО задаются соответствующие им внешние характеристики и их атрибуты (субхарактеристики), определяющие разные стороны управления продуктом в заданной среде. Для набора характеристик качества ПО,
приведенных в требованиях, определяются соответствующие метрики, модели их оценки и диапазоны их значений для измерения отдельных атрибутов качества.

Согласно стандарту 1БО 14598 метрики определяются по модели измерения атрибутов ПО на всех этапах ЖЦ (промежуточная, внутренняя метрика), и особенно на этапе тестирования или функционирования (внешние метрики) продукта. Остановимся на классификации существующих метрик ПО, правилах проведения метрического анализа и процессах их измерения.

Существует три типа метрик: метрики программного продукта, которые используются при измерении его характеристик или свойств; метрики процесса, которые используются при измерении свойств процесса ЖЦ создания продукта; метрики использования.