Файл: Методические указания по практическим работам для обучающихся пи (филиала) дгту в г. Таганроге по специальности (направлению) 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 не поддерживает таких вещей. Ещё конечно же остался вариант в сервере после записи данных написать:
-
if(pipeServer.IsConnected) -
Thread.Sleep(500);
Но это точно же не выход так как сервер будет точно висеть 500 мс, а клиент то может и через 10 мс уже давно всё считал с потока и его нужно было давным-давно закрыть. Как в таких случаях поступают подскажите пожалуйста, ато сам я решение найти не смог. Код моего сервера и клиента (асинхронные операции не используются пока что). Моя обёртка через которую происходит чтение и запись в поток при общении между клиентом и сервером:
Копировать
-
//класс для работы с потоком -
//Позволяет писать пары логин-пароль и считывать результаты их обработки -
class StreamRW -
{ -
private Stream ioStream;//поток куда писать данные -
-
public StreamRW(Stream stream) -
{ ioStream = stream; } -
-
//запись пары логин-пароль в поток -
public void WriteData(Tupledata)
{
byte[] outBuffer;
using (MemoryStream m = new MemoryStream())
using (BinaryWriter writer = new BinaryWriter(m))
{
writer.Write(data.Item1);
writer.Write(data.Item2);
outBuffer = m.ToArray();
}
int len = outBuffer.Length;
ioStream.WriteByte((byte)(len / 256));
ioStream.WriteByte((byte)(len & 255));
ioStream.Write(outBuffer, 0, len);
ioStream.Flush();
}
//чтение пары логин-пароль из потока
public TupleReadData()
{
Tupleresult;
int len;
len = ioStream.ReadByte() * 256;
len += ioStream.ReadByte();
byte[] inBuffer = new byte[len];
ioStream.Read(inBuffer, 0, len);
using (MemoryStream m = new MemoryStream(inBuffer))
using (BinaryReader reader = new BinaryReader(m))
{
try
{
result = new Tuple(reader.ReadString(), reader.ReadString());
}
catch (IOException ex)
{
Console.WriteLine("Error has occured :(\n" +
"If you'd like to know more, you can google it:" + ex.Message);
result = new Tuple("Error", "Error");
}
}
return result;
}
//запись кода результата обработки
public void WriteInt(int answer)
{
byte[] outBuffer = new byte[1] { Convert.ToByte(answer) };
ioStream.Write(outBuffer, 0, 1);
ioStream.Flush();
}
//чтение кода результата обработки (если соединение разорвано на стороне сервера то вернёт -1).
//Исключение выброшено не будет даже если поток закрыт!
public int ReadInt()
{
return Convert.ToInt32(ioStream.ReadByte());
}
}
Сервер:
Копировать
-
private static void ServerThread(object data) -
{ -
//создаём именованный канал -
NamedPipeServerStream pipeServer = -
new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); -
-
//пара логин-пароль для получения инфо от клиента -
Tuplelogpass;
//получим ID (просто для вывода на экран, больше не используется)
int threadId = Thread.CurrentThread.ManagedThreadId;
//сделаем вечный цикл чтобы сервер работал постоянно (ну почти постоянно)
while (true)
{
//подождём подключения
pipeServer.WaitForConnection();
//когда клиент подключился выведем уведомление об этом
Console.WriteLine("Client connected on thread[{0}].", threadId);
try
{
//настроим обёртку на канал
StreamRW srw = new StreamRW(pipeServer);
//получим связку логин-пароль
logpass = srw.ReadData();
//покажем их на экран
Console.WriteLine("Get from client on thread[{0}]: " + logpass.Item1 + " " + logpass.Item2, threadId);
//отправим ответ клиенту
srw.WriteInt(1);
//выведем инфо что клиент отключился
Console.WriteLine("Client on thread[{0}] disconnected.", threadId);
}
catch (IOException e)
{
Console.WriteLine("ERROR: {0}", e.Message);
}
//отсоединить клиента ибо нефиг тут висеть
pipeServer.Disconnect();
}
pipeServer.Close();
}
Клиент:
Копировать
-
{ -
NamedPipeClientStream pipeClient = -
new NamedPipeClientStream(".", "testpipe", -
PipeDirection.InOut, PipeOptions.None, -
TokenImpersonationLevel.Impersonation); -
-
Console.WriteLine("Connecting to server...\n"); -
pipeClient.Connect(); -
-
//настроить обёртку на канал -
StreamRW srw = new StreamRW(pipeClient); -
-
//записать связку логин-пароль в поток -
srw.WriteData(new Tuple("login","password"));
//"зависнуть" на 5секунд чтобы продемонстрировать что сервер всё это время тоже висит и ничего не делает
//в ожидании пока клиент не считает ответ об обработке данных (число int)
Thread.Sleep(5000);
//вывести ответ от сервера
Console.Write(srw.ReadInt());
pipeClient.Close();
// Give the client process some time to display results before exiting.
Thread.Sleep(4000);
}
Практическая работа № 10 «Настройки доступа к репозиторию»
Цель: - научиться настраивать доступ к репозиторию
Форма отчета:
−выполнить задание;
−показать преподавателю;
−ответить на вопросы преподавателя.
Время выполнения: 2 ч
Работа со списком репозиториев в настольном приложении
Список репозиториев формируется на вкладке «Репозитории» диалога «Параметры».
Для открытия диалога «Параметры»
-
Для подключения репозитория с сервера СУБД нажмите кнопку «Добавить» и укажите параметры создаваемого репозитория -
Для редактирования параметров выбранного репозитория:-
нажмите кнопку «Редактировать»; -
выполните команду контекстного меню «Редактировать»; -
дважды щёлкните по репозиторию в списке; -
нажмите клавишу ENTER.
-
-
Для удаления выбранных репозиториев из списка:-
нажмите кнопку «Удалить»; -
выполните команду контекстного меню «Удалить»; -
нажмите клавишу DELETE.
-
Поле «Репозиторий по умолчанию» предназначено для выбора репозитория, который будет отображаться по умолчанию при запуске «Форсайт. Аналитическая платформа».
Задание
Установить доступ к репозиторию на своем ПК.
Практическая работа № 11 «Использование метрик программного продукта»
Цель: - научиться использовать метрик программного продукта
Форма отчета:
−выполнить задание;
−показать преподавателю;
−ответить на вопросы преподавателя.
Время выполнения: 2 ч
В настоящее время в программной инженерии еще не сформировалась окончательно система метрик. Действуют разные подходы к определению их набора и методов измерения. Система измерения включает метрики и модели измерений, которые используются для количественной оценки качества ПО.
При определении требований к ПО задаются соответствующие им внешние характеристики и их атрибуты (субхарактеристики), определяющие разные стороны управления продуктом в заданной среде. Для набора характеристик качества ПО,
приведенных в требованиях, определяются соответствующие метрики, модели их оценки и диапазоны их значений для измерения отдельных атрибутов качества.
Согласно стандарту 1БО 14598 метрики определяются по модели измерения атрибутов ПО на всех этапах ЖЦ (промежуточная, внутренняя метрика), и особенно на этапе тестирования или функционирования (внешние метрики) продукта. Остановимся на классификации существующих метрик ПО, правилах проведения метрического анализа и процессах их измерения.
Существует три типа метрик: метрики программного продукта, которые используются при измерении его характеристик или свойств; метрики процесса, которые используются при измерении свойств процесса ЖЦ создания продукта; метрики использования.