Команды asp


Содержание

Классы Command и DataReader

позволяет выполнить SQL-оператор любого типа. Хотя класс Command можно использовать для решения задач определения данных (таких как создание и изменение баз данных, таблиц и индексов), все же более вероятно его применение для выполнения задач манипулирования данными (вроде извлечения и обновления записей в таблице).

Специфичные для поставщика классы Command реализуют стандартную функциональность, в точности как классы Connection. В данном случае небольшой набор ключевых свойств и методов, используемых для выполнения команд через открытое соединение, определяется интерфейсом IDbCommand.

Основные сведения о командах

Прежде чем использовать команду, необходимо выбрать ее тип, установить ее текст и привязать к соединению. Всю эту работу можно выполнить, установив значения соответствующих свойств (CommandType, CommandText и Connection), либо передать необходимую информацию в аргументах конструктора.

Текстом команды может быть SQL-оператор, хранимая процедура либо имя таблицы. Это зависит от типа используемой команды. Существуют три типа команд, которые описаны в таблице:

Значения перечисления CommandType

Команда будет выполнять прямой оператор SQL. Оператор SQL указывается в свойстве CommandText. Это — значение по умолчанию

Команда будет выполнять хранимую процедуру в источнике данных. Свойство CommandText представляет имя хранимой процедуры

Команда будет опрашивать все записи таблицы. CommandText — имя таблицы, из которой команда извлечет все записи. (Эта опция предназначена только для обратной совместимости с некоторыми драйверами OLE DB. Она не поддерживается поставщиком данных SQL Server и не работает так хорошо, как тщательно направленный запрос.)

Например, ниже показано, как создать объект Command, представляющий запрос:

А вот более эффективный способ использования одного конструктора Command. Обратите внимание, что указывать CommandType не нужно, поскольку значение CommandType.Text принимается по умолчанию:

В этих примерах объект Command просто определяется, но не выполняется. Объект Command предоставляет три метода, которые можно использовать для выполнения команды, в зависимости от того, нужно ли вам извлечь полный результирующий набор, получить единственное значение или просто выполнить отличную от запроса команду. Эти методы перечислены в таблице ниже:

Значение Описание
CommandType.Text
CommandType.StoredProcedure
CommandType.TableDirect
Методы Command

Выполняет команды, отличные от select, такие как SQL-операторы вставки, удаления или обновления записей. Возвращаемое значение указывает количество строк, обработанных командой. Метод ExecuteNonQuery() также можно использовать для выполнения команд определения данных, которые создают, изменяют и уничтожают объекты базы данных (наподобие таблиц, индексов, ограничений и т.п.)

Выполняет запрос select и возвращает значение первого поля первой строки из набора строк, сгенерированного командой. Этот метод обычно применяется при выполнении агрегатной команды select, использующей функции вроде count() или sum() для вычисления единственного значения

Выполняет запрос select и возвращает объект DataReader, который является оболочкой однонаправленного курсора, доступного только для чтения

Чуть позже я продемонстрирую использование этих методов, но для начала нужно разобрать класс DataReader, экземпляр которого возвращает метод ExecuteReader().

Класс DataReader

Класс DataReader позволяет читать данные, возвращенные командой SELECT, по одной строке за раз, в однонаправленном, доступном только для чтения потоке. Иногда это называют курсором. Использование DataReader — простейший путь получения данных, но ему недостает возможностей сортировки и связывания автономного объекта DataSet. Однако DataReader представляет наиболее быстрый способ доступа к данным. Ниже перечислены основные методы DataReader:

Метод Описание
ExecuteNonQuery()
ExecuteScalar()
ExecuteReader()
Методы класса DataReader

Перемещает курсор строки на следующую строку в потоке. Этот метод также должен быть вызван перед чтением первой строки данных (Когда DataReader создается впервые, курсор строки помещается в позицию непосредственно перед первой строкой.) Метод Read() возвращает true, если существует следующая строка для чтения, или false, если прочитана последняя строка в наборе

Возвращает значение, сохраненное в поле с указанным именем столбца или индексом, внутри текущей выбранной строки. Тип возвращенного значения — ближайший тип .NET, наиболее соответствующий встроенному значению, хранимому в источнике данных. Если вы обратитесь к полю по индексу и нечаянно передадите неверный индекс, ссылающийся на несуществующее поле, то получите исключение IndexOutOfRangeException. Используя индексатор для DataReader, можно получить значение по имени поля

Сохраняет значения текущей строки в массиве. Количество сохраняемых полей зависит от размеров массива, переданного этому методу. С помощью свойства DataReader.FieldCount можно определить действительное количество полей в строке и воспользоваться этой информацией для создания массива нужного размера, если нужно сохранить в нем все поля

Эти методы возвращают значение поля с указанным индексом в текущей строке, причем тип данных указывается в имени метода. Обратите внимание, что если попытаться присвоить возвращенное значение переменной неверного типа, возникнет исключение InvalidCastException. Кроме того, эти методы не поддерживают типов, допускающих NULL-значения.

Если поле может содержать null, это придется проверить перед вызовом одного из методов. Чтобы проверить на null-значение, сравните непреобразованное значение (которое можно извлечь по позиции методом GetValue() или по имени с помощью индексатора DataReader) с константой DBNull.Value

Если команда, которая сгенерировала DataReader, возвратила более одного набора строк, этот метод перемещает указатель на следующую строку и устанавливает его непосредственно перед первой строкой

Закрывает модуль чтения. Если исходная команда запустила хранимую процедуру, возвратившую выходное значение, это значение может быть прочитано из соответствующего параметра после закрытия модуля чтения

Метод ExecuteReader() и DataReader

В следующем примере создается простая команда запроса, которая должна вернуть все записи из таблицы Employees базы данных Northwind. Команда создается при загрузке страницы. Соединение открывается, и команда выполняется методом ExecuteReader(), который возвращает SqlDataReader. Получив DataReader, можно организовать цикл для прохождения по его записям, вызывая метод Read() в теле цикла. Этот метод перемещает курсор строки на следующую запись (при первом вызове — на первую строку). Метод Read() также возвращает булевское значение, означающее наличие последующих строк для чтения. В следующем примере цикл продолжается до тех пор, пока Read() не вернет false, после чего элегантно завершается:

Обратите внимание, что этот код читает значение поля TitleOfCourtesy, обращаясь к нему по имени, через индексатор Item. Поскольку свойство Item — индексатор по умолчанию, явно включать имя свойства Item при извлечении значения поля не понадобится. Далее код читает поля LastName и FirstName, вызывая GetString() с индексом поля (1 и 2 в данном случае). И, наконец, код обращается к полю HireDate, вызывая метод GetDateTime() с индексом поля, равным 6. Все эти подходы эквивалентны и включены сюда для демонстрации поддерживаемых вариантов.

Запустив эту страницу, вы увидите результат, показанный на рисунке ниже:

В большинстве страниц ASP.NET столь трудоемкий подход для отображения данных использовать не придется. Вместо этого вы будете применять элементы управления данными, которые описаны в последующих статьях. Однако DataAdapter, скорее всего, будет использоваться при написании кода доступа к данным в компоненте базы данных.

Значения null

Как вам уже наверняка известно, базы данных используют значения null для представления отсутствующей или неопределенной информации. Эту же концепцию можно использовать в .NET с типами, допускающими значения null, которые принимают значения и null-ссылки. Ниже приведен пример с целочисленной переменной, допускающей значение null:

К сожалению, DataReader не интегрируется с допускающими null значениями .NET. Это расхождение объясняется причинами исторического характера. Допускающие null типы данных впервые появились в .NET 2.0, когда модель DataReader уже хорошо устоялась, и ее было трудно менять.

Вместо этого DataReader возвращает константу DBNull.Value, когда встречает в базе данных значение null. Попытка использовать это значение или привести его к другому типу данных вызовет исключение. (Печально, но никакого способа приведения между DBNull.Value и типами, допускающими null, не существует.) В результате должна предприниматься проверка на DBNull.Value там, где это может возникнуть, с использованием следующего кода:

Перечисление CommandBehavior

Метод ExecuteReader() имеет перегруженную версию, которая принимает в качестве параметра значение перечисления CommandBehavior. Одно из часто используемых его значений — CommandBehavior.CloseConnection. Когда это значение передается ExecuteReader(), то DataReader закрывает ассоциированное с ним соединение, как только закрывается сам DataReader (при использовании конструкции using в применении этой опции нет смысла).

Другое допустимое значение — CommandBehavior.SingleRow — повышает производительность выполнения запроса, когда нужно извлечь единственную строку. Например, если вы извлекаете единственную запись, используя уникальное значение первичного ключа (CustomerID, Production и т.д.), то можно применить эту оптимизацию. Можно также использовать CommandBehavior.SequentialAccess для чтения части двоичного поля, что снижает расход памяти при чтении больших двоичных полей.

Другие значения перечисления применяют реже, поэтому здесь не рассматриваются. Полный список можно найти в документации по .NET.

Обработка множества результирующих наборов

Выполняемая команда не обязательно должна возвращать единственный результирующий набор. Она может выполнить более одного запроса и вернуть более одного результирующего набора. Это удобно для извлечения большого объема взаимосвязанных данных, например, списка товаров и их категорий, которые вместе представляют каталог товаров.

Команда может вернуть более одного результирующего набора двумя способами:

Если вызывается хранимая процедура, она может содержать несколько операторов SELECT.

Если вы используете простую текстовую команду, то можете собрать вместе несколько SQL-команд, разделяя их точками с запятой (;). Не все поставщики данных поддерживают такой прием, однако поставщик SQL Server это делает.

Ниже приведен пример строки, определяющей пакет из трех команд select:


Строка содержит три запроса. Все вместе они возвращают первые пять записей из таблицы Employees, первые пять записей из таблицы Customers и первые пять — из таблицы Suppliers. Обработка результатов достаточно проста. Вначале DataReader обеспечивает доступ к результатам из таблицы Employees. По завершении чтения методом Read() всех этих записей вызывается метод NextResult() для перехода к следующему результирующему набору. Когда больше не остается результирующих наборов, этот метод вернет false.

Проход по всем результирующим наборам можно организовать в цикле while, хотя в этом случае нужно проявить осторожность и не вызвать NextResult() до завершения чтения первого результирующего набора. Ниже показан пример применения этого более специализированного приема:

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

Метод ExecuteScalar()

Метод ExecuteScalar() возвращает значение сохраненной в первом поле первой строки результирующего набора, сгенерированного запросом SELECT команды. Этот метод обычно применяется для выполнения запросов, возвращающих единственное поле, возможно, вычисленное агрегатной функцией SQL вроде COUNT() или SUM().

Следующая процедура демонстрирует, как можно с таким подходом получить (и отобразить на странице) количество записей таблицы Employees:

Код достаточно прост, но стоит отметить, что вы должны привести возвращаемое значение к правильному типу, поскольку ExecuteScalar() возвращает объект.

Метод ExecuteNonQuery()

Метод ExecuteNonQuery() выполняет команды, которые не возвращают результирующих наборов, такие как INSERT, DELETE или UPDATE. Метод ExecuteNonQuery() возвращает одну порцию информации — количество обработанных записей (или -1, если команда отлична от INSERT, DELETE или UPDATE). Применение этого метода класса Command аналогично предыдущим методам.

Учебник. Использование перехвата устойчивость и команду подключения с Entity Framework в приложении ASP.NET MVC Tutorial: Use connection resiliency and command interception with Entity Framework in an ASP.NET MVC app

Пока приложение будет выполняться локально в IIS Express на компьютере разработчика. So far the application has been running locally in IIS Express on your development computer. Чтобы реальных приложение стало доступным для других пользователей в Интернете, необходимо развернуть его на веб-поставщик услуг размещения и у вас есть развертывание базы данных на сервер базы данных. To make a real application available for other people to use over the Internet, you have to deploy it to a web hosting provider, and you have to deploy the database to a database server.

В этом руководстве вы узнаете, как использовать перехвата устойчивость и команду подключения. In this tutorial you’ll learn how to use connection resiliency and command interception. Они являются две важные функции Entity Framework 6, которые особенно важны при развертывании в облачной среде: устойчивость подключений (автоматические повторы для временных ошибок) и перехват команд (catch все SQL-запросы, отправляемые базе данных для входа или изменять их). They are two important features of Entity Framework 6 that are especially valuable when you are deploying to the cloud environment: connection resiliency (automatic retries for transient errors) and command interception (catch all SQL queries sent to the database in order to log or change them).

Учебником подключения устойчивость и команда перехвата является необязательным. This connection resiliency and command interception tutorial is optional. Если вы пропустите это руководство, будет лишь небольшие изменения, внесенные в последующих руководствах. If you skip this tutorial, a few minor adjustments will have to be made in subsequent tutorials.

В этом учебнике рассмотрены следующие задачи. In this tutorial, you:

  • Включить устойчивость подключений Enable connection resiliency
  • Включить перехват команд Enable command interception
  • Протестируйте новую конфигурацию Test the new configuration

Предварительные требования Prerequisites

Включить устойчивость подключений Enable connection resiliency

При развертывании приложения в Windows Azure, используется для развертывания базы данных в базу данных SQL Azure Windows, облачная служба баз данных. When you deploy the application to Windows Azure, you’ll deploy the database to Windows Azure SQL Database, a cloud database service. При подключении к облачная служба баз данных, чем при веб-сервер и сервер базы данных непосредственно соединены друг с другом в одном центре обработки данных, временных ошибок подключения обычно чаще. Transient connection errors are typically more frequent when you connect to a cloud database service than when your web server and your database server are directly connected together in the same data center. Даже если веб-сервер cloud и облачная служба баз данных размещаются в одном центре обработки данных, существуют дополнительные сетевые подключения между ними, которые могут возникнуть проблемы, такие как подсистемы балансировки нагрузки. Even if a cloud web server and a cloud database service are hosted in the same data center, there are more network connections between them that can have problems, such as load balancers.

Также это облачная служба обычно совместно используется другими пользователями, это означает, что отклик может зависеть от их. Also a cloud service is typically shared by other users, which means its responsiveness can be affected by them. И доступ к базе данных может быть подвергаются регулированию. And your access to the database might be subject to throttling. Регулирование означает, что служба базы данных создает исключения, при попытке доступа к нему дополнительные часто не допускается в вашей уровень соглашения об уровне обслуживания. Throttling means the database service throws exceptions when you try to access it more frequently than is allowed in your Service Level Agreement (SLA).

Многие или большинство проблем подключения при обращении к облачной службе являются временными, то есть они устранить самостоятельно за короткий период времени. Many or most connection problems when you’re accessing a cloud service are transient, that is, they resolve themselves in a short period of time. Поэтому при попытке выполнения операции базы данных получить тип ошибки, обычно временное, можно попробовать операцию после короткого ожидания и операции может пройти успешно. So when you try a database operation and get a type of error that is typically transient, you could try the operation again after a short wait, and the operation might be successful. Можно предоставить значительно удобней для пользователей, если обработка временных ошибок с автоматически повторить попытку, невидимую большинство из них для клиента. You can provide a much better experience for your users if you handle transient errors by automatically trying again, making most of them invisible to the customer. Функция устойчивости подключений в Entity Framework 6 автоматизирует, что процесс повторного не удалось выполнить SQL-запросов. The connection resiliency feature in Entity Framework 6 automates that process of retrying failed SQL queries.

Функция устойчивости подключений должен быть настроен для определенной базы данных службы: The connection resiliency feature must be configured appropriately for a particular database service:

  • Он должен знать, какие исключения могут быть временными. It has to know which exceptions are likely to be transient. Вы хотите повторить попытку ошибки, вызванные временная потеря в сетевое подключение не ошибки, например из-за ошибок программы. You want to retry errors caused by a temporary loss in network connectivity, not errors caused by program bugs, for example.
  • Она должна ожидать соответствующий период времени между повторными попытками, сбой операции. It has to wait an appropriate amount of time between retries of a failed operation. Вы можете ожидать больше между повторными попытками для пакетной обработки, чем вы можете на интерактивной веб-странице, где пользователь ожидает ответа. You can wait longer between retries for a batch process than you can for an online web page where a user is waiting for a response.
  • Он должен повторить попытку на соответствующее число раз, прежде чем прекратить попытки. It has to retry an appropriate number of times before it gives up. Может потребоваться повторить несколько раз в рамках пакетного процесса, как в интерактивном приложении. You might want to retry more times in a batch process that you would in an online application.

Можно настроить эти параметры вручную для любой среды базы данных, поддерживаемом поставщиком Entity Framework, но уже были настроены значения по умолчанию, которые обычно доступны также в интерактивном приложении, использующем базу данных SQL Azure Windows, и Это параметры, которые вы реализуете для приложения университета Contoso. You can configure these settings manually for any database environment supported by an Entity Framework provider, but default values that typically work well for an online application that uses Windows Azure SQL Database have already been configured for you, and those are the settings you’ll implement for the Contoso University application.

Вам нужно выполнить, чтобы включить устойчивость подключения создать класс в сборке, производный от DbConfiguration и в этом классе присвоить базе данных SQL стратегия выполнения, в EF – еще один термин для политика повтора. All you have to do to enable connection resiliency is create a class in your assembly that derives from the DbConfiguration class, and in that class set the SQL Database execution strategy, which in EF is another term for retry policy.

В папке DAL, добавьте файл класса с именем SchoolConfiguration.cs. In the DAL folder, add a class file named SchoolConfiguration.cs.

Замените код шаблона следующим кодом: Replace the template code with the following code:

Платформа Entity Framework автоматически выполняет код в класс, производный от DbConfiguration . The Entity Framework automatically runs the code it finds in a class that derives from DbConfiguration . Можно использовать DbConfiguration класса, чтобы выполнять задачи по настройке в коде, в противном случае это делается в Web.config файл. You can use the DbConfiguration class to do configuration tasks in code that you would otherwise do in the Web.config file. Дополнительные сведения см. в разделе EntityFramework конфигурация на основе кода. For more information, see EntityFramework Code-Based Configuration.

В StudentController.cs, добавьте using инструкции для System.Data.Entity.Infrastructure . In StudentController.cs, add a using statement for System.Data.Entity.Infrastructure .

Изменить все catch блокирует перехвата DataException исключения, чтобы они перехватывать RetryLimitExceededException исключения вместо этого. Change all of the catch blocks that catch DataException exceptions so that they catch RetryLimitExceededException exceptions instead. Пример: For example:

Вы использовали DataException выявления ошибок, которые могут быть временными, чтобы обеспечить понятное сообщение «повторить». You were using DataException to try to identify errors that might be transient in order to give a friendly «try again» message. Но теперь, когда вы включили политику повтора, единственные ошибки, скорее всего, будут временными будет уже были испытаны и не удалось несколько раз, и фактическое возвращаемое исключение будет вставлено в RetryLimitExceededException исключение. But now that you’ve turned on a retry policy, the only errors likely to be transient will already have been tried and failed several times and the actual exception returned will be wrapped in the RetryLimitExceededException exception.

Включить перехват команд Enable command interception

Теперь, когда вы включили политику повтора, как протестировать чтобы убедиться, что он работает должным образом? Now that you’ve turned on a retry policy, how do you test to verify that it is working as expected? Это не так просто заставить временная ошибка происходит, особенно при работе локально, и было бы особенно трудно интегрировать фактическое временных ошибок в автоматизированные модульные тест. It’s not so easy to force a transient error to happen, especially when you’re running locally, and it would be especially difficult to integrate actual transient errors into an automated unit test. Чтобы протестировать функция устойчивости подключений, нужен способ перехватывать запросы, которые отправляет Entity Framework для SQL Server и замените типа исключения, которое обычно временное ответ от сервера SQL. To test the connection resiliency feature, you need a way to intercept queries that Entity Framework sends to SQL Server and replace the SQL Server response with an exception type that is typically transient.

Перехват запросов также можно использовать для реализации рекомендации для облачных приложений: журнала задержки и успешность всех вызовов к внешним службам такие как службы базы данных. You can also use query interception in order to implement a best practice for cloud applications: log the latency and success or failure of all calls to external services such as database services. Предоставляет EF6 выделенной API ведения журнала , можно упростить его сделать ведения журнала, но в этом разделе руководства вы узнаете, как использовать Entity Framework механизма перехвата напрямую, как для Ведение журнала и для имитации временных ошибок. EF6 provides a dedicated logging API that can make it easier to do logging, but in this section of the tutorial you’ll learn how to use the Entity Framework’s interception feature directly, both for logging and for simulating transient errors.

Создайте класс и интерфейс ведения журнала Create a logging interface and class

Объект рекомендация для ведения журнала — это с помощью интерфейса вместо жестко запрограммированного вызовы методов System.Diagnostics.Trace или класса ведения журнала. A best practice for logging is to do it by using an interface rather than hard-coding calls to System.Diagnostics.Trace or a logging class. Что упрощает изменение вашего механизма ведения позже, если вы захотите это сделать. That makes it easier to change your logging mechanism later if you ever need to do that. Поэтому в этом разделе мы создадим интерфейс ведения журнала и класса для реализации его/p > So in this section you’ll create the logging interface and a class to implement it./p>

Создание папки в проект и назовите его ведение журнала. Create a folder in the project and name it Logging.

В ведение журнала папке создайте файл класса с именем ILogger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named ILogger.cs, and replace the template code with the following code:

Этот интерфейс предоставляет три уровня трассировки, чтобы указать относительную важность журналы и один, предоставляет сведения о задержке для внешней службы вызовы, такие как запросы к базе данных. The interface provides three tracing levels to indicate the relative importance of logs, and one designed to provide latency information for external service calls such as database queries. Методы ведения журнала имеют перегрузки, которые позволяют передавать исключение. The logging methods have overloads that let you pass in an exception. Это так, что сведения об исключении, включая стек трассировки и внутренние исключения надежно регистрируется классом, который реализует интерфейс, а не полагаться на который выполняется в каждом вызове метода ведения журнала в приложении. This is so that exception information including stack trace and inner exceptions is reliably logged by the class that implements the interface, instead of relying on that being done in each logging method call throughout the application.

Методы TraceApi позволяют отслеживать задержку каждого вызова определенной внешней службы, такие как базы данных SQL. The TraceApi methods enable you to track the latency of each call to an external service such as SQL Database.

В ведение журнала папке создайте файл класса с именем Logger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named Logger.cs, and replace the template code with the following code:

Реализация использует System.Diagnostics для трассировки. The implementation uses System.Diagnostics to do the tracing. Это встроенная функция .NET, что позволяет легко создать и использовать данные трассировки. This is a built-in feature of .NET which makes it easy to generate and use tracing information. Существует много «прослушиватели» можно использовать с трассировкой System.Diagnostics записывать журналы к файлам, к примеру, или для записи их в хранилище BLOB-объектов Azure. There are many «listeners» you can use with System.Diagnostics tracing, to write logs to files, for example, or to write them to blob storage in Azure. Некоторые из вариантов, а также ссылки на другие ресурсы, Дополнительные сведения см. в Устранение неполадок веб-сайтов Azure в Visual Studio. See some of the options, and links to other resources for more information, in Troubleshooting Azure Web Sites in Visual Studio. Этот учебник позволяет только просмотреть журналы в Visual Studio вывода окна. For this tutorial you’ll only look at logs in the Visual Studio Output window.

В рабочем приложении может потребоваться учитывать пакеты трассировки, отличный от System.Diagnostics и интерфейс ILogger позволяет относительно легко переключиться на механизм разных трассировки, если вы решили сделать это. In a production application you might want to consider tracing packages other than System.Diagnostics, and the ILogger interface makes it relatively easy to switch to a different tracing mechanism if you decide to do that.

Создайте перехватчик классы Create interceptor classes

Теперь необходимо создать классы, которые Entity Framework будет вызывать каждый раз, когда оно для отправки запроса к базе данных для имитации временных ошибок и сделать ведения журнала. Next you’ll create the classes that the Entity Framework will call into every time it is going to send a query to the database, one to simulate transient errors and one to do logging. Эти классы перехватчик должен быть производным от DbCommandInterceptor класса. These interceptor classes must derive from the DbCommandInterceptor class. В них вы напишете переопределения методов, которые вызываются автоматически в том случае, когда запрос будет выполняться. In them you write method overrides that are automatically called when query is about to be executed. В этих методах можно изучать или запрос, который отправляется в базу данных к журналу, а также можно изменить запрос перед отправкой в базу данных или возвращать результат Entity Framework самостоятельно без даже передача запроса к базе данных. In these methods you can examine or log the query that is being sent to the database, and you can change the query before it’s sent to the database or return something to Entity Framework yourself without even passing the query to the database.

Чтобы создать класс перехватчик, которая будет записывать каждый запрос SQL, который отправляется в базу данных, создайте файл класса с именем SchoolInterceptorLogging.cs в DAL папку и замените код шаблона Следующий код: To create the interceptor class that will log every SQL query that is sent to the database, create a class file named SchoolInterceptorLogging.cs in the DAL folder, and replace the template code with the following code:

Для успешно выполненных запросов или команд этот код записывает в журнал сведения с сведения о задержке. For successful queries or commands, this code writes an Information log with latency information. Для исключений он создает журнал ошибок. For exceptions, it creates an Error log.

Для создания класса-перехватчика, вызывающая фиктивный временных ошибок при вводе «Throw» в поиска поле, создайте файл класса с именем SchoolInterceptorTransientErrors.cs в DAL папку и замените код шаблона следующим кодом: To create the interceptor class that will generate dummy transient errors when you enter «Throw» in the Search box, create a class file named SchoolInterceptorTransientErrors.cs in the DAL folder, and replace the template code with the following code:

Этот код только переопределения ReaderExecuting метод, который вызывается для запросов, которые могут возвращать несколько строк данных. This code only overrides the ReaderExecuting method, which is called for queries that can return multiple rows of data. Если вы хотите проверить устойчивость подключения для других типов запросов, можно также переопределить NonQueryExecuting и ScalarExecuting методы, как ведение журнала перехватчик. If you wanted to check connection resiliency for other types of queries, you could also override the NonQueryExecuting and ScalarExecuting methods, as the logging interceptor does.


При запуске страницы учащихся и введите «Throw» в строке поиска, этот код создает фиктивный исключение базы данных SQL для номер ошибки 20, типом, известным обычно временной. When you run the Student page and enter «Throw» as the search string, this code creates a dummy SQL Database exception for error number 20, a type known to be typically transient. Другие коды ошибок, момент опознаны как временные являются 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501 и 40613, но они могут быть изменены в новые версии базы данных SQL. Other error numbers currently recognized as transient are 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501, and 40613, but these are subject to change in new versions of SQL Database.

Код возвращает исключение в Entity Framework, вместо выполнения запроса и передачи результатов запроса назад. The code returns the exception to Entity Framework instead of running the query and passing back query results. Временное исключение возвращается в четыре раза, а затем код возвращается к обычной процедуры передачи запроса к базе данных. The transient exception is returned four times, and then the code reverts to the normal procedure of passing the query to the database.

Так как все, что в системе, вы сможете см. в разделе Entity Framework пытается выполнить запрос предшествовало в четыре раза, что в приложении отличается только что занимает больше времени для визуализации страницы с результатами запроса. Because everything is logged, you’ll be able to see that Entity Framework tries to execute the query four times before finally succeeding, and the only difference in the application is that it takes longer to render a page with query results.

Количество раз, когда Entity Framework будет повторять попытку настраивается; код определяет четыре раза, потому что это значение по умолчанию для политики выполнения базы данных SQL. The number of times the Entity Framework will retry is configurable; the code specifies four times because that’s the default value for the SQL Database execution policy. Если изменить политику выполнения, необходимо было также изменение здесь расположен код, указывает, сколько раз создаются временные ошибки. If you change the execution policy, you’d also change the code here that specifies how many times transient errors are generated. Можно также изменить код, чтобы создать дополнительные исключения, чтобы платформа Entity Framework вызывает исключение RetryLimitExceededException исключение. You could also change the code to generate more exceptions so that Entity Framework will throw the RetryLimitExceededException exception.

Значение, указанное в поле поиска будет находиться в command.Parameters[0] и command.Parameters[1] (один используется имя и фамилия). The value you enter in the Search box will be in command.Parameters[0] and command.Parameters[1] (one is used for the first name and one for the last name). Если найдено значение «% Throw %», «Throw» заменяется в эти параметры «», чтобы некоторые студенты будут найдены и возвращается. When the value «%Throw%» is found, «Throw» is replaced in those parameters by «an» so that some students will be found and returned.

Это просто удобный способ проверить устойчивость подключений, в зависимости от изменяющихся некоторые входные данные для пользовательского интерфейса приложения. This is just a convenient way to test connection resiliency based on changing some input to the application UI. Можно также написать код для создания временных ошибок для всех запросов или обновлений, как описано далее в комментарии о DbInterception.Add метод. You can also write code that generates transient errors for all queries or updates, as explained later in the comments about the DbInterception.Add method.

В Global.asax, добавьте следующий using инструкции: In Global.asax, add the following using statements:

Добавьте выделенные строки, чтобы Application_Start метод: Add the highlighted lines to the Application_Start method:

Эти строки кода являются, что вызывает перехватчик кода для запуска в том случае, когда Entity Framework отправляет запросы к базе данных. These lines of code are what causes your interceptor code to be run when Entity Framework sends queries to the database. Обратите внимание, что так как вы создали отдельные перехватчик классы для имитации временных ошибок и ведение журнала, вы можете независимо друг от друга, включить или отключить их. Notice that because you created separate interceptor classes for transient error simulation and logging, you can independently enable and disable them.

Можно добавить с помощью перехватчики DbInterception.Add метод в любом месте кода; он не должен быть в Application_Start метод. You can add interceptors using the DbInterception.Add method anywhere in your code; it doesn’t have to be in the Application_Start method. Другой вариант — поместить этот код в класс DbConfiguration, который был создан ранее, чтобы настроить политику выполнения. Another option is to put this code in the DbConfiguration class that you created earlier to configure the execution policy.

Везде, где поместить этот код, нужно избегать выполнения DbInterception.Add для же перехватчик более чем один раз, или вы получите дополнительные перехватчик экземпляров. Wherever you put this code, be careful not to execute DbInterception.Add for the same interceptor more than once, or you’ll get additional interceptor instances. Например если дважды добавить перехватчик ведения журнала, вы увидите два журнала для каждого запроса SQL. For example, if you add the logging interceptor twice, you’ll see two logs for every SQL query.

Перехватчики выполняются в порядке регистрации (порядок, в котором DbInterception.Add вызывается метод). Interceptors are executed in the order of registration (the order in which the DbInterception.Add method is called). Порядок может имеет значения в зависимости от выполняемых задач в перехватчик. The order might matter depending on what you’re doing in the interceptor. Например, перехватчик может изменить команду SQL, получаемый в CommandText свойство. For example, an interceptor might change the SQL command that it gets in the CommandText property. Если это приводит к изменению команду SQL, далее перехватчик получите измененные команду SQL, не исходную команду SQL. If it does change the SQL command, the next interceptor will get the changed SQL command, not the original SQL command.

Вы написали код имитации временной ошибки способом, который позволяет вызывать временные ошибки, введя другое значение в пользовательском Интерфейсе. You’ve written the transient error simulation code in a way that lets you cause transient errors by entering a different value in the UI. Кроме того можно написать код перехватчик всегда создать последовательность временных исключений без проверки на наличие значения определенного параметра. As an alternative, you could write the interceptor code to always generate the sequence of transient exceptions without checking for a particular parameter value. Затем вы сможете добавить перехватчик только в том случае, если вы хотите создавать временные ошибки. You could then add the interceptor only when you want to generate transient errors. Если в этом случае не добавляйте перехватчик до после завершения инициализации базы данных. If you do this, however, don’t add the interceptor until after database initialization has completed. Другими словами выполните операции по крайней мере одна база данных, например запрос на одном из своего набора сущностей, перед началом создания временных ошибок. In other words, do at least one database operation such as a query on one of your entity sets before you start generating transient errors. Платформа Entity Framework выполняет несколько запросов во время инициализации базы данных, и они не выполняются в транзакции, в случае ошибки во время инициализации может возникнуть контекст которого необходимо получить в несогласованное состояние. The Entity Framework executes several queries during database initialization, and they aren’t executed in a transaction, so errors during initialization could cause the context to get into an inconsistent state.

Протестируйте новую конфигурацию Test the new configuration

Нажмите клавишу F5 запустите приложение в режиме отладки, и нажмите кнопку учащихся вкладки. Press F5 to run the application in debug mode, and then click the Students tab.

Посмотрите на Visual Studio вывода окно, чтобы просмотреть выходные данные трассировки. Look at the Visual Studio Output window to see the tracing output. Может потребоваться прокрутить вверх после некоторых ошибок JavaScript, чтобы получить журналы, сохраняемые в средство ведения журналов. You might have to scroll up past some JavaScript errors to get to the logs written by your logger.

Обратите внимание на то, что вы видите фактические SQL-запросы, отправляемые в базу данных. Notice that you can see the actual SQL queries sent to the database. Вы увидите некоторые начальные запросы и команды, которые Entity Framework выполняет обновление, чтобы приступить к работе, проверка версии базы данных и таблицы журнала миграции (вы узнаете о миграции в следующем учебном курсе). You see some initial queries and commands that Entity Framework does to get started, checking the database version and migration history table (you’ll learn about migrations in the next tutorial). Появится запрос для разбиения на страницы, чтобы узнать, сколько учащихся, и наконец видеть запрос, который получает данные об учащихся. And you see a query for paging, to find out how many students there are, and finally you see the query that gets the student data.

В учащихся странице введите «Throw» в строке поиска и нажмите кнопку поиска. In the Students page, enter «Throw» as the search string, and click Search.

Вы заметите, что браузер кажется зависает на несколько секунд, пока Entity Framework повторением запроса несколько раз. You’ll notice that the browser seems to hang for several seconds while Entity Framework is retrying the query several times. Первый Повтор происходит очень быстро, затем ожидать увеличения перед каждой следующей попытки. The first retry happens very quickly, then the wait before increases before each additional retry. Процесс больше ожидания перед каждым повтором называется экспоненциального откладывания. This process of waiting longer before each retry is called exponential backoff.

При отображении страницы отображение учащиеся имеют «значение» в именах, посмотрите в окно вывода, и вы увидите, что тот же запрос количество предпринятых попыток пяти, первые четыре раза возвращением временных исключений. When the page displays, showing students who have «an» in their names, look at the output window, and you’ll see that the same query was attempted five times, the first four times returning transient exceptions. Для каждой временной ошибки вы увидите журнала, создаваемого при создании временной ошибке в SchoolInterceptorTransientErrors класс («возвращение временная ошибка команды. ») и вы увидите журнала, записанных при SchoolInterceptorLogging возвращает исключение. For each transient error you’ll see the log that you write when generating the transient error in the SchoolInterceptorTransientErrors class («Returning transient error for command. «) and you’ll see the log written when SchoolInterceptorLogging gets the exception.

Так как вы ввели строку поиска, параметризован запрос, который возвращает данные об учащихся: Since you entered a search string, the query that returns student data is parameterized:

Значения параметров не выполняется вход, но это можно сделать. You’re not logging the value of the parameters, but you could do that. Если вы хотите просмотреть значения параметра, можно написать код ведения журнала, чтобы получить значения параметров из Parameters свойство DbCommand объект, который вы получаете в методы перехватчика. If you want to see the parameter values, you can write logging code to get parameter values from the Parameters property of the DbCommand object that you get in the interceptor methods.

Обратите внимание на то, что нельзя повторите этот тест, если вы остановите приложение и перезапустите его. Note that you can’t repeat this test unless you stop the application and restart it. Если вы хотите иметь возможность тестировать устойчивость подключения несколько раз в рамках одного запуска приложения, можно написать код, чтобы сбросить счетчик ошибок в SchoolInterceptorTransientErrors . If you wanted to be able to test connection resiliency multiple times in a single run of the application, you could write code to reset the error counter in SchoolInterceptorTransientErrors .

Чтобы увидеть разницу стратегии выполнения (политика повтора) делает, комментарий SetExecutionStrategy строку в SchoolConfiguration.cs, снова запустите на страницу учащихся в режиме отладки и повторить поиск «Throw». To see the difference the execution strategy (retry policy) makes, comment out the SetExecutionStrategy line in SchoolConfiguration.cs, run the Students page in debug mode again, and search for «Throw» again.

Это время отладчик останавливается на первой порожденное исключение немедленно в том случае, когда предпринимается попытка выполнения запроса в первый раз. This time the debugger stops on the first generated exception immediately when it tries to execute the query the first time.

Раскомментируйте SetExecutionStrategy строку в SchoolConfiguration.cs. Uncomment the SetExecutionStrategy line in SchoolConfiguration.cs.

Получение кода Get the code

Дополнительные ресурсы Additional resources

Ссылки на другие ресурсы Entity Framework можно найти в доступ к данным ASP.NET — рекомендуемые ресурсы. Links to other Entity Framework resources can be found in ASP.NET Data Access — Recommended Resources.

Следующие шаги Next steps

В этом учебнике рассмотрены следующие задачи. In this tutorial, you:

  • Устойчивость подключения включено Enabled connection resiliency
  • Перехват поддержкой команд Enabled command interception
  • Тестирование новой конфигурации Tested the new configuration

Перейдите к следующей статьи вы узнаете о Code First migrations и развертывание Azure. Advance to the next article to learn about Code First migrations and Azure deployment.

Особенности запуска внешних команд из ASP-страниц

Архив номеров / 2004 / Выпуск №9 (22) / Особенности запуска внешних команд из ASP-страниц

Метод Описание
Read()
GetInt32(), GetChar(), GetDateTime(), Get. ()
NextResult()

ИВАН КОРОБКО

Особенности запуска внешних команд
из ASP-страниц

Создавая приложения на ASP, предназначенные для облегчения управления различными сервисами сети, программисты часто сталкиваются с необходимостью запускать из них приложения (BAT, VBS, EXE и т. д.). Читая документацию компании Microsoft, понимаешь, что решить задачку не представляет никакой сложности. Но существует ряд тонкостей в запуске приложений из ASP-страниц, которые почему-то не описаны в документации. На практике сталкиваешься с тем, что сценарий должен работать, поскольку все написано правильно и встроенный обработчик ошибок сообщает об отсутствии таковых, однако требуемый результат не достигается. Эта статья посвящена запуску различных типов приложений из ASP-страниц.

Active Server Pages

ASP-страницы – это сценарии, программный код которых выполняется при их запросе. Результатом действия скрипта является HTML/DHTML-страница, которая отображается у клиента. Структура документа на ASP очень проста. В первой строке всегда указывается язык, с помощью которого созданы скриптовые вставки ASP-страница. Таким языком программирования может быть один из двух, поддерживаемый всеми браузерами: Jscript или VBScript. Во всех примерах в данной статье будет использоваться VBScript, поскольку он наиболее симпатичен автору. Каждый из этих примеров легко переписать на Jscript. Итак, первая строка любого из сценариев на ASP выглядит следующим образом:

Программный код, находящийся между , выполняется на сервере и подчинен синтаксису одного из выбранных языков. Весь остальной код представляет собой HTML-страницу в явном виде.

Листинг типовой ASP-страницы выглядит следующим образом:

Response.write variable ‘ отображение на экране содержимого переменной

После обработки интерпретатором IIS программного кода и преобразования результатов его работы в HTML/DHTML необходимо дать команду на отображение страницы в браузере клиента. Такой командой является Response.Write q, где q – имя переменной, содержащей фрагмент HTML-кода.

Методы запуска приложений из VBS

Рассмотрим вызов приложений непосредственно из файла VBS, для этого можно использовать один из методов – Run или Exec. Необходимо отметить, что в VBScript не существует функции, с помощью которой можно запустить приложения, однако она существует в WSH, который поддерживает VBSscipt и JScript . Создание экземпляра объекта WSH осуществляется с помощью команды Create Object(“WScript.Shell”).

Set Wshell = CreateObject(«Wscript.shell»)

Set Proc = Wshell.Exec(«application.exe»)


» Ждать, пока не завершится выполнение программы

Do While Proc.Status = 0

Set Wshell = Nothing

Set Wshell = CreateObject(«Wscript.shell»)

Set Proc = Wshell.Run(«application.exe»)

Set Wshell = Nothing

По своей сути оба варианта равнозначны, однако отображаемая в CMD-консоли информация (касается command-line-утилит) может быть прочитана только в первом из приведенных примеров. Во втором примере можно считать только статус завершения дочернего процесса (код ошибки): 0 – команда успешно выполнена, 1 – нет.

Для успешного запуска различных приложений из ASP-страницы необходимо учитывать некоторые особенности, о которых речь пойдет ниже. Все приложения можно условно разделить на несколько групп:

  • приложения с графическим интерфейсом;
  • приложения, работающие из командной строки (command lines utilities);
  • скрипты на VBS/Jscript (хотя скрипты на VBS относятся к приложениям, запускаемым из командной строки, выделим их в отдельную группу).

Первая особенность: поскольку код ASP-страниц исполняется на сервере, и только результат в виде HTML-страницы пересылается на клиентскую машину, то для успешного запуска приложения на сервере, пользователь должен обладать соответствующими правами. IIS представляет собой трехзвенную систему.

Пусть IIS имеет настройки по умолчанию. В этом случае при загрузке любой ASP-страницы она стартует от имени встроенного пользователя (см. рис. 2). Если страница работает с некими базами данных, например с Active Directory, то пользователь, запускающий данную страницу должен обладать правами администратора. Существует несколько способов выполнить эти условия. Первый – вместо учетной записи встроенного пользователя прописать имя учетной записи администратора сети. При таком раскладе любой пользователь в сети сможет посетить данную страницу, т.к. она будет запускаться от имени системного администратора. Этот способ предоставляет всем доступ к данной странице, что, согласитесь, неправильно. Это еще полбеды. Главное, что таким образом резко снижается безопасность всей системы. В случае ошибок на странице злоумышленник запросто запустит вредоносный код с правами администратора. Поэтому предлагается другой способ решения проблемы, с помощью которого можно ограничить доступ к ресурсам. В настройках IIS необходимо сбросить флажок (см. рис. 2) с Enable anonymous access и установить его напротив Basic Authentication. Также следует изменить права на файловую структуру используемого сайта, исключив оттуда группу Everyone и добавив соответствующую группу безопасности. При такой настройке IIS только системные администраторы получат доступ к данной странице. При попытке любого пользователя, не являющегося администратором сети, получить доступ к странице IIS будут запрошены имя и пароль пользователя.

Если необходимо расширить круг лиц, которым должен быть доступен данный сайт, и при этом пользователи не являются системными администраторами, то можно воспользоваться вариантом, являющимся синтезом двух ранее изложенных решений: ограничить доступ на сайт с помощью Basic Authentication и правами на файловую структуру, запускать скрипт, инкапсулированный в страницу с правами администратора.

Только что мы рассмотрели механизм взаимодействия первого и второго звена в трехзвенной системе. Первым звеном является рабочая станция пользователя, вторым – сервер, на котором установлен IIS. Взаимосвязь этих звеньев осуществляется с помощью одного пользователя. Между вторым и третьим звеном (сервер IIS, процессы, порождаемые из ASP) взаимодействие осуществляется с помощью другого пользователя. Рассмотрим взаимодействие второго и третьего звена подробнее.

При запуске из кода ASP-страницы какого-либо приложения осуществляется взаимодействие между вторым и третьим звеном. IIS порождает процесс, запускаемый от имени другого встроенного пользователя. Поскольку ASP-страница выполняется на сервере, то для запуска приложения необходимы соответствующие права. Управление этой учетной записью пользователя осуществляется в Application Tools (см. рис. 3).

Такова первая особенность, касающаяся абсолютно всех приложений. Существует вторая, также характерная для всех приложений.

С помощью ASP-страниц можно вызывать приложения, находящиеся на удаленном компьютере. Некоторые приложения не могут быть запущены на другой платформе. Например, некоторые утилиты, успешно запускающиеся в Windows 2000, выдают сообщение об ошибке на Windows 2003, аналогичная ситуация может возникнуть с приложениями Windows 98, запускаемыми на Windows 2k.

Запуск приложения c графическим интерфейсом

Запуск приложения осуществляется с использованием одного из вышеописанных методов (см. примеры 2, 3). Единственной особенностью является необходимость указывать полный путь к запускаемому приложению. Путь может быть как локальным, например, C:Folder1. так и сетевым: ServerC$Folder1.

Запуск приложения из командной строки (command line utility)

В качестве приложения может быть программа, запускаемая из командной строки (command-line utility), приложение для Windows (файл с расширением EXE).

Рассмотрим особенности запуска command-line-приложений из ASP-страниц. Синтаксис команды запуска утилиты из командной строки следующий:

%comspec% /c cmd_util.exe

Префикс %comspec% /c является обязательным. Переменная окружения %comspec% указывает на C:Windows System32cmd.exe. Поскольку при запуске внешней команды порождается процесс CMD, то после отработки команды его необходимо закрыть. Эта процедура осуществляется с помощью ключа /c. Если процессы не закрывать, то в конце концов возникнет недостаток памяти на сервере, что приведет к существенному снижению скорости его работы, а впоследствии к отказу функционирования различных служб компонентов. Путь к утилите также необходимо писать полностью. Допускается использование сетевых имен в формате UNC (ServerShare. ).

Запуск скриптов имеет ряд особенностей. Рассмотрим два вида скриптов, которые, на взгляд автора, используются наиболее часто в данной ситуации: VBS-скрипты и BAT-файлы.

Запуск VBS-файлов из скрипта

Бывают ситуации, когда необходимо из ASP-страницы запустить внешний VBS-скрипт. Как правило, он запускается с параметрами. Рассмотрим кусок листинга VBS-скрипта, касающийся чтения его внешних параметров.

Чтение параметров основано на использовании свойства Arguments объекта WScript WSH. Приведем пример, который определяет, с какими параметрами был запущен скрипт:

t=”Количество заданных параметров — ” & Wscript.Arguments.Count & chr(13) & “Параметры:” & chr(13)

For Each arg in objArgs

t = t & arg & chr(13)

Чтение значений элементов массива, содержащего аргументы скрипта, можно осуществлять другим способом. Оба варианта дают один и тот же результат.

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

t=»Количество заданных параметров — » & Coun & chr(13) & «Параметры:» & chr(13)

For i=0 to Coun-1

t = t & i+1 & «: «& objArgs(i) & chr(13)

Иногда необходимо получить значение определенного аргумента. Это проиллюстрировано в примере 6. Необходимо помнить, что нумерация элементов начинается с 0:

Msgbox objArgs(2) » Чтение третьего аргумента.

Приведенный пример не является образцом программирования, поскольку в примере отсутствует обработчик ошибок.

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

q = InputBox (“Введите номер считываемого аргумента”, “Чтение номера аргумента”)-1

При использовании BAT-файлов необходимо помнить, что отдельный процесс порождается не только в момент запуска такого типа файлов, но и при выполнении каждой из команд, находящихся внутри него. По той же самой причине не стоит выполнять взаимосвязанные команды, поскольку может сложиться ситуация, когда первая еще не успела отработать, а вторая, содержащаяся в следующей строке и использующая результат работы первой команды, уже начала выполняться. В результате произойдет ошибка. Чтобы избежать этого, вызывайте команды из кода ASP-страницы и осуществляйте проверку результата отработанной команды.

Подводя итог, кратко отметим, что при работе с внешними файлами из ASP-страниц необходимо учитывать особенности работы IIS. Надеюсь, что прочитав эту статью, у программистов не будет проблем с запуском приложений из ASP-страниц.

Команда ASP.NET Core смогла добиться обработки более миллиона запросов в секунду

Команды ASP.NET Core и .NET Core смогли добиться обработки 1.15 миллионов запросов в секунду.

Повышение производительности — 2300% относительно ASP.NET 4.6.

Стоит отметить, что .NET Core сейчас является проектом с открытым исходным кодом под лицензией MIT.

Они его через nginx запустили?

Насколько я понял, это self hosted приложение. Запускали на Win 2020 Nano Server и Linux.

что это за зверь?

И таки что они сделали?

Подозрение что взяли наработки из моно

Удалили лишние sleep() из кода.


Мигрировали с 4-го пня на 24-х процессорный зион.

это ж сколько лет они гнали откровенный брак?

А предыдущий рекорд кем был установлен и в каком размере?

Максимально облегченный Win Server который умеет к тому же жить внутри docker’a: https://www.pluralsight.com/blog/it-ops/microsoft-nano-server-announced

Вряд ли. Mono, Node.js и ASP.NET 4.6 примерно в одинаковой заднице по сравнению с Core: https://d3renderer.azurewebsites.net/plaintext/v7?src=1

Your Nano Server workloads (Hyper-V, IIS, failover clustering, scale-out file server, etc.) run as isolated containers that borrow from Docker technology
умеет к тому же жить внутри docker’a

Нельзя же так переводить.

Сори, добавил возможно отсебятины, имел ввиду то, что по идее Win Server 2020 должен поддерживаться новым докером, который МС и Докер вроде как совместно пилят. Была где-то такая инфа.

Помню в игрушку играл на Intel286 под DOS — гоночки, медленоватые, как мне показалось. А потом как то запустил на своем более новом (по тем временам) AMD K-6-III — так очень быстро гонки пошли, после старта до аварии проходило меньше секунды ;-)

Здесь по такому же принципу получили прирост производительности?

Я же говорил ASP лучшие!

И продолжил, про «новый докер»

зачем тащить всякую дрянь и гадать на ней про новый докер?

Это прогресс! Уже снес Ubuntu, ставлю ASP.

Для этого есть кнопка Turbo.

Зачем сносить? ASP.NET Core отлично под убунтой работает.

Думаю после этой новости большинство проектов на C/C++ и прочих питонов перейдут на .NET

Уже бросаю пайтон и бегу на дотнет, лол.

Иди поплескайся в бассейне со своим другом))

Нужнее оно от этого не стало.

А сколько у других платформ в такой же конфигурации?

Жду поддержку в ненси.

The third decimal place 0.05 Million (e.g. 50,000) is around the total number of requests per second that ASP.NET 4.6 could perform of the same type, on the same hardware

Наверное всё-таки слипы убрали

1,150,000+ requests served per second is for small fine-grained requests

практически пинговали сервер

Running on an Azure G4 VM you can see we can hit 12.6 Gbps while only using 36% CPU

Azure G4: 16 cores, 224 GB RAM, 3 072 GB DISK, $3 631 / mo 0_o

(Нигде не написано, что 1,150,000 они получили именно на G4, на чём они получиил 1,150,000 я вообще в статье не нашёл)

бенчмарки от микрософт, одним словом. С другой стороны стало понятно, что юзать — .Net Core или mono

Надо будет посмотреть, как Теперь оно по сравнению с джавой

Использование команд¶

DNX используются для сборки и запуска .NET приложений для Windows, Mac и Linux. DNX управляет процессом хостинга, CLR логикой и определяет точку входа приложения. Вы можете использовать DNX, чтобы выполнять команды из командной строки.

Что такое команда?¶

Команда — это именованный механизм выполнения точки входа .NET с конкретными аргументами. Команды можно определять локально в проекте либо глобально на всей машине. Файл project.json позволяет вам определять команды для вашего проекта. Команды, которые вы определяете для проекта, понимает VS Code, а также Visual Studio. Глобальные команды, которые не являются конкретными для проекта, могут быть установлены на машине и запущены из командной строки.

Использование команд в вашем проекте¶

В разделе commands из примера выше project.json перечислены четыре команды:

В команду может быть включен набор аргументов, которые передаются DNX. В примере сверху первая часть выражения — это сборка с точкой входа, которую и попытается выполнить DNX. Обратите внимание, что в разделе commands команда ef реализуется сборкой EntityFramework.Commands . Этой команде не требуется специальный аргумент, для определения команды нужно только имя сборки. Для команд web и kestrel аргументы содержатся в связанном файле hosting.ini. В файле hosting.ini вы увидите аргументы server и server.urls . Команда kestrel , как и команда web , проверит сборку Microsoft.AspNet.Hosting на точку входа, а затем передаст аргументы server и server.urls точке входа. Аргументы для каждой команды передаются точке входа через аргумент args метода main .

Сборка, представленная в разделе commands , должна быть передана с помощью пакета, от которого зависит ваше приложение.

Вы можете добавить пакет команд и его зависимости в проект с помощью Package Manager Console. Например, чтобы установить пакет SecretManager из Package Manager Console, введите следующее:

Глобальный файл NuGet.config используется для нахождения корректного набора пакетов NuGet при установке глобальных командных пакетов NuGet. Используйте Install-Package -? из Package Manager Console, чтобы просмотреть информацию, касающуюся команды Install-Package .

Запуск команд с помощью dnx.exe¶

Вы можете использовать DNX, чтобы запускать команды, определенные в вашем проекте, если введете следующее в командную строку из директории проекта:

Вы также можете запускать команды из VS Code или Visual Studio. В VS Code откройте Command Palette (Ctrl+Shift+P) и введите имя команды, которую вы хотите запустить. В Visual Studio откройте Command Window (Ctrl+Alt+A) и введите имя нужной команды.

Например, следующая команда запускает веб приложение с помощью веб сервера Kestrel:

Чтобы запустить консольное приложение, используйте следующую команду:

Обратите внимание, что запуск команды — это быстрый вариант указания сборки команд и их аргументов напрямую в DNX. Например, dnx web — это краткий вариант для dnx Microsoft.AspNet.Hosting hosting.ini , где файл hosting.ini содержит параметры команды.

Глобальные команды¶

Глобальные команды — это консольные приложения DNX (в пакете NuGet), которые устанавливаются глобально и запускаются из командной строки. Разница между глобальными командами и командами, которые вы добавляете в раздел commands файла project.json состоит в том, что глобальные команды доступны для всего, что запускается под пользовательским профилем. Вы можете устанавливать, запускать, удалять, создавать и публиковать глобальные команды.

Команда dnu commands install будет использовать NuGet источники, содержащиеся в локальном XML файле NuGet.Config, чтобы определить, где искать пакеты NuGet. Основными разделами для этого файла являются packageRestore , packageSources , disabledPackageSources и activePackageSource .

Установка глобальных команд¶

Чтобы добавить глобальную команду (и пакет), вы можете использовать .NET Development Utility (DNU), чтобы скачать пакет NuGet и установить его.

Например, введите следующее из командной строки:


Вы можете использовать опцию —overwrite , чтобы переопределить конфликтующие команды. Используйте dnu commands install -? из командной строки, чтобы увидеть информацию, связанную с командой install .

Запуск глобальных команд¶

Глобальные команды можно запускать из командной строки после установки нужных пакетов. Например, если у вас установлен SecretManager, из директории проекта вы можете вызвать следующую команду, чтобы получить все user secrets для вашего приложения:

Чтобы просмотреть список DNX рантаймов, включите активный DNX рантайм. Вы можете ввести dnvm list из командной строки. Если вы хотите изменить активный DNX рантайм, используйте dnvm use [version] -p . Например, dnvm use 1.0.0-beta7 –p . Глобальные команды всегда запускаются при активном DNX рантайме.

Удаление глобальных команд¶

Чтобы удалить глобальные команды, вам стоит использовать следующую DNU команду:

[arguments] — это имя команды, которую нужно удалить. Например:

Чтобы получить больше информации, наберите в командной строке dnu commands uninstall -? .

Встроенные глобальные команды¶

Есть следующие встроенные глобальные команды:

  1. user-secret
  2. sqlservercache

У этих команд есть конкретные пакеты NuGet. Когда вы устанавливаете глобальную команду, то связанные пакеты NuGet также будут установлены.

Сборка и публикация глобальных команд¶

Вы можете использовать .NET Development Utility (DNU), чтобы собирать, паковать и публиковать глобальные команды. Глобальная команда считается консольным проектом. При сборке проекта возникают бинарные файлы. При упаковке проекта возникает пакет NuGet, который можно отправить к набору пакетов (например, http://nuget.org)), а затем его можно использовать. При публикации собираются все требуемые элементы рантайма (DNX и пакеты) в одну папку, так что ее можно развернуть как приложение.

Когда вы генерируете консольное приложение с помощью нужного шаблона, оно включает в себя файл program.cs, содержащий точку входа Main . После создания консольного приложения вы можете собрать и запустить его с помощью DNX команды:

В консольном приложении файл project.json содержит команду run в разделе commands . Команда dnx используется для выполнения в сборке точки входа (функции Program.Main ). Если вы используете сейчас команду dnx run , DNX найдет команду, основываясь на имени, а затем найдет Main в файле program.cs.

Команда dnx run является сокращенной версией для выполнения точки входа текущего проекта. Это эквивалент dnx [project_name] .

Когда вы готовы собрать консольное приложение, содержащее глобальную команду, используйте следующую команду, чтобы создать сборки для проекта в заданной директории:

После сборки консольного приложения вы можете упаковать его, используя следующую команду для создания NuGet пакетов:

Для публикации NuGet пакетов вы используете следующую команду:

Команда publish упакует ваше приложение в отдельную директорию, которая может быть запущена. Тогда будет создана следующая структура директории:

  • output/
  • output/packages
  • output/appName
  • output/commandName.cmd

В этой директории содержатся все пакеты, которые вам нужны. В директории appName содержится код приложения. Если у вас есть ссылки проекта, их код появится в собственной директории на этом же уровне.

Есть три команды, которые отсутствуют при глобальной установке: run , test и web . Вы можете создать пакет NuGet с этими командами, но их нельзя установить глобально. Итак, для шаблона консольного приложения по умолчанию вы должны переименовать команду run как-то иначе, например, my-cmd , если хотите, чтобы команду можно было установить глобально.

Также вам нельзя использовать следующие имена команд: dnx , dnvm , nuget , dnu . Если вы попытаетесь их использовать, то получите ошибку при сборке.

Элементы глобальных команд¶

Глобальные команды — это консольные приложения DNX (в пакете NuGet), которые устанавливаются глобально и запускаются из командной строки.

Если вы используете Visual Studio, то SecretManager и SqlConfig уже будут установлены для вас. Если вы не используете Visual Studio, сперва установите DNX, затем запустите dnu commands install [namespace.command] . После установки вы увидите имена установленных команд.

SecretManager¶

Этот пакет ASP.NET содержит команды для управления secrets (“секретами”) приложения. При разработке современных веб приложений разработчики зачастую настраивают систему аутентификации как OAuth. Одной из определяющих особенностей таких аутентификационных схем являются общие secrets, которые должны знать ваше приложение и сервер аутентификации.

Сборка: Microsoft.Framework

Использование: user-secret [command] [options]

Опции:

Рубрика: Программирование / Веб-программирование
Опция Описание
-?|-h|–help Вспомогательная инфо
-v|–verbose Подробные выходные данные

Команды:

Команда Описание
set Устанавливает secret на определенное значение
help Вспомогательная инфо
remove Удаляет определенный secret
list Просмотр всех secrets
clear Удаляет все secrets

Чтобы получить больше информации о команде, запустите из командной строки user-secret [command] —help .

SqlConfig¶

Пакет Microsoft.Framework.Caching.SqlConfig содержит команды для создания таблицы и индексов в БД Microsoft SQL Server, чтобы они были использованы для дистрибутивного кэширования ASP.NET 5.

Сборка: Microsoft.Framework.Caching

Использование: sqlservercache [options] [command]

Опция Описание
-?|-h|–help Вспомогательная инфо
-v|–verbose Подробные выходные данные

Команды:

Команда Описание
set Устанавливает secret на определенное значение
help Вспомогательная инфо
remove Удаляет определенный secret
list Просмотр всех secrets
clear Удаляет все secrets


Чтобы получить больше информации, используйте из командной строки user-secret [command] —help .

Об объектах команды ASP

Объект команды может многократно использоваться в том смысле, что сервер приложений может многократно использовать простую откомпилированную версию объекта для выполнения команды несколько раз. Сделать команду многократно используемой можно с помощью задания свойству «Подготовленный» объекта «Команда» значения true , как это показано в следующем предложении VBScript.

Если известно, что команда будет выполняться несколько раз, наличие простой откомпилированной версии объекта может увеличить эффективность операций с базой данных.

Объект команды создается сценариями на ASP-странице, но Dreamweaver позволяет создавать объекты команды без написания ASP-кода.

Создание страниц ASP.NET в среде Visual Studio

Среда Visual Studio существенно облегчает разработку Web-приложений. Основными действиями, выполняемыми в ходе создания приложения в среде, являются создание форм, написание обработчиков событий, добавление файлов (таблиц стилей, страниц и т.п.), отладка

В Visual Studio разных версий предлагается несколько режимов создания Web-приложений, функционирующих на основе ASP.NET, чаще всего используются Website… и Project… В Visual Studio 2005 включен только Website…, в 2008 и 2010 – оба.

В режиме создания Web-сайта (File — New Website…). Visual Studio создает только файлы, относящиеся к сайту (файл с кодом страницы, файл с программами обработчиков и файл конфигурации).

В окне New Web Site могут быть дополнительно указаны параметры: версия .NET, шаблон (выбираем ASP.NET WEB Site), размещение (место хранения файлов Web-сайта), язык программирования. После того, как выбор сделан (нажата ОК) будет создана заготовка Web-приложения (три основных файла). Компиляция страниц будет выполняться средой ASP.NET перед открытием в браузере.

В режиме создания проекта (File — New Project…) кроме основных файлов, генерируется несколько вспомогательных и файл проекта с расширением .csproj, в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры.

В окне New Project кроме типа (ASP.NET Web Application), места размещения и языка, необходимо выбрать имя (Solution Name), которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога.

В отличие от режима создания Web Site, кроме размещения информации в различных файлах, при запуске Web-проекты компилируются Visual Studio (а не ASP.NET). Классы Web-страниц объединяются в одну сборку, которая получает то же имя, что и у Web-проекта (например, WebApplication) и затем размещается в папке bin. В Web-проекте для страниц всегда используют модель отделенного кода, объявления для всех элементов управления содержаться в файле с расширением .aspx.desginer.cs. Во время компиляции файлы с кодами обработчиков и кодами элементов управления будут объединены. В беспроектном Web-сайте файла с объявлениями элементов управления нет, поскольку эта часть кода генерируется во время компиляции системой ASP.NET. Есть и другие отличия (например, в содержании директивы Page и т.п.), останавливаться на которых мы не будем.

Дальнейшие действия по созданию Web-приложения практически не отличаются.

В ходе работы по созданию сайтов используются окна и панели, состав и место расположения которых можно изменять, используя меню View и перетаскивая их мышью. Типичный вид среды при разработке Web-приложений приведен на рис.4.4.

Рис. 4.4. Вид окна для разработки Web-приложений

Панели инструментов, содержат различные команды для форматирования текста, поиска текста и т.д.

Обозреватель решений, отображает файлы и папки веб-узла.

Окно документов обеспечивает отображение документов в различных представлениях и служит визуализированным редактором форм.

Окно Свойств отображает параметры страницы, элементов HTML, элементов управления и других объектов, а также позволяет изменять их.

Панель элементов содержит элементы управления и HTML-элементы, которые можно размещать на страницах.

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

Окно вывода служит для вывода сообщений среды (ошибки, информация отладчика и т.п.).

Создание форм. Создаваемые документы (формы и файлы с программным кодом) открываются в окне документов. При работе с формами предусмотрено два режима отображения Design и Source. В первом режиме интерфейс можно конструировать визуально, во втором – путем написания кода разметки. Для переключения используются закладки в нижней части окна. В режиме Design можно повысить наглядность отображаемой структуры, выполнив команду Details из меню View.

Форма ASP.NET – документ, на основе которого формируется HTML-страница, отправляемая клиенту. Она создается путем размещения элементов в окне документов. Элементы для размещения выбираются из панели инструментов. В панели элементы сгруппированы по типам.

Чаще всего используются элементы из групп HTML и Standard.

Группа HTML содержит HTML-элементы, соответствующие одноименным элементам обычных Web-страниц. С их использование создается статическая разметка страницы. Однако они могут быть преобразованы в серверные путем добавления атрибута runat=»server» или выполнения команды Run As Server Control из контекстного меню элемента. Их называют серверными HTML-элементами управления, при их обработке перед отправкой формируется только один HTML-тег.

Группа Standard содержит серверные элементы управления с расширенной функциональностью. Среди них имеются полнофункциональные элементы управления, выполняющие генерацию достаточно сложного HTML-кода и клиентских сценариев JavaScript для создания развитого интерфейса на клиенте. Это такие элементы как Calendar, AdRotator, TreeView. Среди них есть и аналоги HTML-элементов (кнопок, текстовых полей и т.д.). Элементы этой группы называют серверными Web-элементами управления, они являются основными при создании форм.

Среди других групп отметим такие.

Login — элементы управления входом в систему. Эти элементы управления поддерживают аутентификацию пользователя, их можно использовать вместо написания своих собственных интерфейсов для входа в систему и создания новых пользователей.

Navigation — элементы управления навигацией. Они позволяют пользователю перемещаться с одной страницы на другую, отображают карту сайта и др.

Validation — элементы управления проверкой правильности заполнения полей пользователем.

Data — элементы управления данными.

После размещения элемента имеется возможность задания его свойств с помощью окна свойств. Элемент необходимо выделить, в окне отобразятся его свойства, которые можно изменять.

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

В обработчиках можно задать реакцию на действия пользователя, изменять свойства элементов, динамически создавать элементы.

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

. Часть 1

Интерфейс к базе данных с помощью ASP

Постановка задачи

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

Для начала давайте все-таки разберемся, что же от нас требуется. По сути, необходимо создать базу данных всех статей, подготовить несколько HTML-форм для загрузки статей на сервер, их поиска, сортировки, удаления и, наконец, отображения результата.

Я почти уверен, что подобная задача актуальна применительно практически к любому сайту, тем более что подобным образом (разве что без возможностей поиска, сортировки и удаления) работает большинство гостевых книг (guestbook).

Что нам понадобится

Для реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор.

Создание и подготовка базы данных

Прежде всего создадим базу данных статей, для чего:

  • запустим приложение Microsoft Access;
  • любым из известных способов создадим новую базу данных. Назовем ее «Articles»;
  • в созданной базе данных создадим таблицу с именем, например «Articles»;
  • пользуясь инструментом «Конструктор», определим поля нашей таблицы и типы принимаемых ими значений (рис. 1);
  • заполним таблицу несколькими статьями в соответствии с созданными полями (рис. 2);
  • сохраним базу данных в файле «ArticlesDB.mdb».

Далее необходимо прописать нашу базу данных в соответствующем разделе источников данных системы, для этого:

  • запустим программу-конфигуратор источников данных (Data Sources ODBC) — Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC;
  • перейдем во вкладку «System DSN» и создадим новый источник данных, нажав на «Add…»;
  • в появившемся списке драйверов выберем драйвер баз данных Microsoft Access — «Microsoft Access Driver (*.mdb)» и нажмем на «Finish»;
  • в строке «Data Source Name» зададим имя нашей базы данных, например «Articles» (это то имя, по которому мы в дальнейшем будем обращаться к ней);
  • нажмем на «Select…», выберем подготовленный нами файл «ArticlesDB.mdb» и нажмем «OK».

В результате в списке источников данных в вашей системе появится строка, представленная на рис. 3.


Оформляем главную страницу (index.asp)

С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов . В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов , в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале.

Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & «
» отображает на экране браузера клиента подготовленное сервером значение переменной Link и HTML-тэг
, то есть перевод строки. Особый интерес вызывает переменная rs. Для искушенных программистов сразу скажу — это указатель. Однако в ASP с целью облегчения работы начинающих указатели маскируются. Здесь не встретишь громоздких С’шных конструкций, типа «я знаю, что ты знаешь, что я знаю», или, выражаясь программистским языком, указатель на указатель… Однако сделано это так искусно, что гибкость программирования при этом не теряется, нет лишь прямой работы с указателями, а только работа с помощью специальных функций, скрывающих от программиста рутину и защищающих указатели от некорректных действий. Таким образом, выражение rs.Fields («Article»).value означает значение поля «Article» текущего значения указателя на элемент базы данных (в нашем случае статей) и содержит текст статьи, которая соответствует текущей позиции указателя на все статьи. Переход к следующему элементу базы (смещение указателя) выполняется с помощью инструкции Rs.MoveNext. В приведенном выше примере это не делается, а попросту формируется ссылка на текст статьи в виде ее названия и отображается комментарий самой первой статьи, соответствующей результату запроса. Давайте попробуем отобразить все статьи нашей базы данных на главной странице в виде HTML. И еще, обратите особое внимание на директиву:

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

Первая строчка скрипта шаблона HTML присваивает переменной TheID значение, переданное ссылкой с использованием метода Request.QueryString. Далее открывается база данных, из которой читается статья (запись), соответствующая идентификатору, переданному из главного скрипта (index.asp).

Создаем главную страницу

Таким образом в таблицу в цикле будут добавляться ряды со ссылками на статьи и с аннотациями, пока не будут отображены все статьи из базы данных. Следует обратить внимание на переменную Cnt. По окончании цикла она будет содержать число обработанных статей (рядов таблицы).

Язык структурированных запросов — SQL

Настала пора разобраться с тем, что таится за строчками:

По сути, именно за этими двумя строчками кроется работа с нашей базой данных: первая представляет собой текстовую строку с запросом к базе данных (текстовые строки в ASP записываются в двойных кавычках); вторая — содержит директиву выполнения этого запроса с одновременным присвоением результата переменной (указателю на записи в базе данных). В рамках настоящей статьи мы не будем рассматривать SQL (Structured Query Language) во всех деталях, а остановимся лишь на тех его операторах, без понимания которых дальнейшая работа будет невозможна. Для тех, кому этого покажется недостаточным, советую посетить отобранные мною сайты с детальной документацией по SQL.

Для полноценной работы нам необходимо познакомиться с четырьмя операторами этого мощного языка, предназначенного специально для работы с базами данных.

DELETE удаляет те ряды из «Имя Таблицы», которые удовлетворяют условию, определенному в «Определении», и возвращает число удаленных рядов. Если выполнить команду DELETE без условия WHERE, то все ряды указанной таблицы будут удалены. В этом случае DELETE возвратит 0. Ключевое слово LOW_PRIORITY откладывает выполнение операции DELETE до завершения работы чтения из таблицы других клиентов.

SELECT используется для извлечения рядов (записей) из одной или более таблиц. Выражение_Select определяет столбцы таблицы, значения которых необходимо извлечь. Все ключевые поля должны быть заданы в строгой последовательности. К примеру, выражение HAVING должно следовать за любым выражением GROUP BY и до любого выражения ORDER BY.

Выражение_Select можно заменить псевдонимом (alias) с помощью ключевого слова AS. Псевдоним используется в качестве идентификатора имени столбца и может быть использован наряду с ключевыми словами ORDER BY или HAVING.

Выражение HAVING может относиться к любому столбцу или псевдониму в Выражении_Select. Оно применяется к запросу в последнюю очередь, непосредственно перед посылкой данных клиенту. SELECT . INTO OUTFILE ‘имя_файла’ заносит отобранные записи в файл. Файл создается непосредственно на сервере и не может «уже существовать» (одна из основных причин такого механизма заключается в предотвращении случайного «затирания» различных важных файлов).

INSERT используется для добавления новых записей в существующую таблицу. Допустимо две формы использования INSERT.

Первая форма — INSERT . VALUES — вставляет ряды на основании заданных значений. Вторая форма — INSERT . SELECT — вставляет ряды, выбранные из другой таблицы.

Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Ключевое слово IGNORE в команде INSERT позволяет избегать вставки повторяющихся строк (используется в сочетании с ключевыми словами PRIMARY или UNIQUE). Для второй формы INSERT INTO . SELECT операция не может содержать выражения ORDER BY. Таблица, в которую производится добавление записей, не может присутствовать в выражении FROM части SELECT запроса потому, что запрещено производить выделение из той же самой таблицы, в которую производится вставка.

REPLACE служит для редактирования содержимого таблицы и работает в точности как INSERT, за исключением того, что если старая запись в таблице имеет то же значение, что и записываемая, то старая запись удаляется прежде, чем добавляется новая.

UPDATE обновляет поля существующей таблицы новыми значениями. Выражение SET показывает, какие поля (столбцы) должны быть изменены, и значения, которые должны быть им присвоены. Выражение WHERE, если оно есть, указывает, какие ряды должны быть обновлены. В противном случае операция применяется ко всем рядам таблицы. Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Выражения UPDATE выполняются слева направо.

Обновляет значение поля Password в таблице WAPassword, записывая в поле, чей идентификатор ID равен 1 значение ‘passw’.

Увеличивает значение поля counter таблицы Счетчик на 1.

Удваивает поле age, а затем прибавляет 1 к его значению в таблице persondata.

Что такое Global.asa

Global.asa позволяет выполнять определенные скрипты в начале работы клиентской сессии или при инициализации IIS. Примером тому может служить простейший счетчик числа посещений сайта. Более того, допустимо использовать множественные файлы Global.asa. Однако следует помнить, что ASP-скрипт ищет самый близкий (расположенный в том же каталоге) файл Global.asa и использует именно его.

По сути, этот файл может содержать четыре скрипта: первый будет выполняться при инициализации службы IIS/PWS (Application_OnStart), второй — при остановке службы IIS/PWS (Application_OnEnd) (обычно эти первые два скрипта отрабатывают в процессе перезагрузки компьютера), и еще два скрипта выполняются дополнительно при инициализации сессии пользователя (Session_OnStart) и по ее окончании (Session_OnEnd). Данная схема очень сильно напоминает пары «конструктор-деструктор». Неспроста всякая переменная, которая должна быть использована (например, в текущей сессии), может быть инициализирована в Session_OnStart с тем, чтобы быть использованной в процессе работы сессии, она же уничтожается (обнуляется) в Session_OnEnd.

Global.asa не может содержать тэгов HTML. Недопустимо использование JavaScript. Не рекомендуется писать файл Global.asa с помощью каких-либо HTML-редакторов, для этого гораздо лучше использовать NotePad. И еще один совет: прежде чем вставлять скрипт в файл Global.asa, попробуйте его в работе в обычном ASP-файле.

Пример файла Global.asa

Добавляем новую статью (UploadForm.asp и Upload2DBS.asp)

Теперь, когда мы разобрались с SQL, можно приступать к добавлению новой статьи, причем делать мы это будем прямо с сайта, а если быть точнее — непосредственно с HTML-формы. Для этого сначала создадим файл с самой формой и определим скрипт-реакцию на подтверждение (кнопку «Publish the article!»). (Предполагается, что читатель знаком с азами построения HTML-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.)

Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:

  • на загрузку статьи с сайта должен иметь право не каждый (следовательно, желательно предусмотреть пароль для доступа к этой функции);
  • у каждой статьи есть определенная тема (рубрика), причем она не может быть произвольной, а должна выбираться из списка;
  • список можно хранить непосредственно в HTML-файле и, каждый раз изменяя его, изменять сам файл. Это самый простой и быстрый способ;
  • однако для того, чтобы позволить динамически изменять и пополнять этот список, рекомендуется держать его в базе данных. Это позволит пользователям произвольным образом изменять его содержимое и не потребует переделки формы. Для простоты сначала рассмотрим вариант со встроенным («жестко прошитым») рубрикатором.

Как видим, передача управления осуществляется благодаря директиве ACTION=»http://localhost/Upload2DBS.asp»> в тэге формы. Тем самым указывается скрипт-ответ на реакцию пользователя после нажатия на кнопку «Publish the article!». Теперь остановимся на селекторе рубрик. Как уже отмечалось, желательно перевести его содержимое в базу данных. Для этого в нашей базе данных (файл ArticlesDB.mdb) создадим новую таблицу с именем, к примеру «Topics», в которой с помощью конструктора определим всего одно поле — «Topic» типа «текст». Далее заполним эту таблицу произвольными значениями нашего рубрикатора и отсортируем полученный список в алфавитном порядке. После чего следует заменить тэг

Теперь давайте разберемся с самой сутью дальнейшей работы. Что же должен делать наш скрипт-реакция?

Во-первых, следует позаботиться о том, чтобы все обязательные поля (а они отмечены звездочкой) были введены. Наиболее правильным способом проверки этого является скрипт, написанный на любом языке описания скриптов (например, JavaScript), который будет проверять, введены ли значения обязательных полей. Для этого достаточно добавить в определение тэга формы параметр onsubmit=»preprocess();», где preprocess() — имя функции-скрипта, который и будет осуществлять проверку. Здесь как нельзя кстати видно преимущество языков описания сценариев (JavaScript, Jscript, VBScript) перед ASP. ASP выполняется на стороне сервера, а перегружать связь «клиент-сервер» простой проверкой типа «введены ли значения», согласитесь, неправильно. Однако специально в целях обучения мы будем делать это с помощью ASP.

И еще. Прежде чем приступить к выполнению нашей задачи, следует сказать еще об одной небольшой проблеме: когда мы будем вставлять в ячейку базы данных текст, его форматирование (даже самое простое) не сохранится, и в дальнейшем его невозможно будет корректно отобразить на HTML-странице, поскольку поле Memo хранит неформатированную строку текста. Чтобы избежать этого, следует написать функцию, которая позволит производить примитивное HTML-форматирование введенного текста статьи, перед тем как записать его в базу данных. Другими словами, в самом примитивном случае (хотя бы для того, чтобы сохранить исходную разбивку на строки) функция должна вставлять символы конца строки там, где во входном потоке имеются символы переноса строк.

Удаляем статью (RemoveForm.asp и Rem.asp)

Было бы неплохо предусмотреть возможность удаления статьи с нашего сайта: во-первых, она может устареть, а во-вторых, в процессе ее подготовки не исключены ошибки или опечатки. Останавливаться на форме удаления статьи не будем, скажем лишь, что она содержит единственные элементы с запросом пароля и кнопкой удаления (см. файл RemoveForm.asp), и сразу перейдем к рассмотрению непосредственно процесса удаления:

Особое внимание следует уделить первым двум строкам. Они получают значение глобальной переменной текущего сеанса (сессии) работы со значением идентификатора текущей статьи (в нашем случае удаляемой), которая была инициализирована (файл ArtTmp.htm) следующей строкой:

Таким образом, в текущий скрипт передается в качестве параметра сеансовая переменная с идентификатором текущей статьи, которую необходимо удалить. Имеется в виду, что ссылка на удаление присутствует в странице с шаблоном (файл ArtTmp.htm) и удаляемая статья является текущей.

Организуем поиск (SearchForm.asp и SearchDBS.asp)

Как известно, без поиска навигация в сколь-нибудь солидной базе данных невозможна в принципе. Попробуем организовать поиск статьи по ее реквизитам, причем постараемся организовать булев (логический) поиск, соединяя отдельные значения критериев поиска с помощью логики «И/ИЛИ».

Опять же не заостряя внимание на поисковой форме (файл SearchForm.asp), перейдем непосредственно к самому процессу поиска:

Самое интересное происходит при формировании запроса к базе из составляющих:

В зависимости от введенной пользователем комбинации исходных полей из этих компонентов формируется окончательный запрос, в частности для полей «Author» и «Title». Возможны четыре случая: оба поля пусты, пусто первое поле, пусто второе поле и оба поля не пусты. Соответствующая строка SQL-запроса в каждом из этих случаев формируется по-своему. То же самое относится к состоянию селекторов рубрик статей и порядку их сортировки. При добавлении той или иной подстроки учитывается состояние «радиокнопок» И/ИЛИ и соответствующая подстрока добавляется в SQL-запрос, предваряясь логическим элементом «and» или «or» соответственно. После того как окончательный запрос сформирован, он выполняется, а результирующая страница формируется исходя из списка статей, удовлетворяющих критериям.

Полный код приведенных в статье примеров, включая файл базы данных, находится на нашем CD-ROM.

И в заключение

Напоследок хотелось бы сориентировать разработчиков ASP-страниц в мире документации и инструментальных средств. Дело в том, что автор настоящей статьи провел не один день сидя в Интернете в поисках всевозможных исходных текстов, документации, инструментальных средств и теоретических основ этого мощного средства.

Среди множества инструментальных средств, служащих для облегчения создания ASP-приложений, выделяются два: Easy ASP © Eric Banker, 2000 и Microsoft InterDev из комплекта Microsoft Visual Studio 6.0. Первый — очень удобное, несложное и небольшое средство для быстрого создания ASP-приложений. Второй представляет собой мощный, тяжеловесный интегрированный пакет в духе Microsoft для разработки всевозможных Web-приложений.

Временная версия EasyASP 4.0 находится на нашем CD-ROM.

Среди огромного числа сайтов мною были отобраны те, посещение которых было для меня особенно полезным и с которыми хотелось ознакомить читателей, а именно:

http://www.15seconds.com/issue/000210.htm — создание динамичных JavaScript-скриптов с помощью ASP и интерфейсов к базам данных


http://www.alphasierrapapa.com/iisdev/ — сайт, посвященный разработке серверов IIS с помощью ASP

http://www.websiteresources.com/ — огромная база исходных текстов всевозможных Web-программ

Примеры ASP-кода для профессионалов

http://www.asptoday.com/search.asp?category=ASP Tricks — масса полезных советов для начинающих программировать на ASP

http://www.oreilly.com/catalog/aspnut/ — замечательная книга популярнейшей серии «In a Nutshell» всемирно известного издательства O’REILLY «ASP in a Nutshell A Desktop Quick Reference». На сайте бесплатно размещена одна из глав книги

http://www.chilisoft.net/ — версии ASP для различных платформ можно скачать с этого сайта

http://www.willcam.com/sql/ — введение в структурированный язык запросов SQL

SQL Reference and Example Site — хорошо структурированный материал по SQL

Применение ASP-команд для изменения базы данных в Dreamweaver

На этой странице

Пользовательский интерфейс в Dreamweaver СС и более поздних версиях стал проще. В результате этого некоторые функции, описанные в этой статье, могут отсутствовать в Dreamweaver CC и более поздних версиях. Дополнительные сведения см. в этой статье.

Об объектах команды ASP

Объект команды ASP — это объект сервера, выполняющий некоторую операцию с базой данных. Объект может содержать любой SQL-оператор, включая оператор возврата набора записей или оператор для вставки, обновления или удаления записей из базы данных. Объект команды может изменять структуру базы данных в случае, если SQL-оператор добавляет или удаляет столбец из таблицы. Объект команды можно также использовать для выполнения в базе данных хранимой процедуры.

Объект команды может многократно использоваться в том смысле, что сервер приложений может многократно использовать простую откомпилированную версию объекта для выполнения команды несколько раз. Сделать команду многократно используемой можно с помощью задания свойству «Подготовленный» объекта «Команда» значения true , как это показано в следующем предложении VBScript.

Если известно, что команда будет выполняться несколько раз, наличие простой откомпилированной версии объекта может увеличить эффективность операций с базой данных.

Подготовленные команды поддерживаются не всеми поставщиками баз данных. Если база данных не поддерживает подготовленные команды, она может вернуть ошибку в случае, если свойству задано значение true . База данных может даже проигнорировать запрос на подготовку команды и задать свойство «Подготовленный» значение false .

Объект команды создается сценариями на ASP-странице, но Dreamweaver позволяет создавать объекты команды без написания ASP-кода.

Применение ASP-команд для изменения базы данных

Dreamweaver можно использовать для создания объектов ASP-команд, выполняющих вставку, обновление или удаление записей из базы данных. Назначьте объекту команды SQL-оператор или хранимую процедуру, выполняющую операцию с базой данных.

Dreamweaver выполняет SQL-оператор на основе типа выбранной операции. Например, если выбрана операция «Вставить», диалоговое окно выглядит примерно следующим образом:

Более подробную информацию о создании SQL-операторов для изменения базы данных см. в руководстве по Transact‑SQL.

В следующем примере показан оператор Insert с тремя переменными SQL. Значения этих переменных предоставляются параметрами URL-адреса, передаваемыми на страницу и определенными в столбце «Динамическое значение» в области «Переменные».

Просмотреть значение «Размер» можно на панели «Базы данных» в Dreamweaver. Найдите нужную базу данных на панели «Базы данных» и разверните ее. Затем выберите рабочую таблицу и тоже разверните ее. В таблице указаны размеры полей. Например, ADDRESS (WChar 50). В данном примере размер равен 50. Также можно найти размер в приложении базы данных.

Для типов данных «Числовой», «Логический» и «Дата/время» в качестве размера всегда используется -1.

Для определения значения «Тип» см. нижеприведенную таблицу.

Тип в базе данных

Тип в Dreamweaver

Числовой (MS Access, MS SQL Server, MySQL)

С двойной точностью

Логический, «Да»/«Нет» (MS Access, MS SQL Server, MySQL)

С двойной точностью

Дата/время (MS Access, MS SQL Server, MySQL)

Все другие типы текстовых полей, включая типы текстовых данных MySQL char, varchar и longtext

см. таблицу базы данных

Текст (MS Access) или nvarchar, nchar (MS SQL Server)

см. таблицу базы данных

Memo (MS Access), ntext (MS SQL Server) или поля с поддержкой большого объема текста

Более подробную информацию о типах и размерах SQL-переменных см. по адресу www.adobe.com/go/4e6b330a_ru.

Dreamweaver вставляет в страницу ASP-код, который при выполнении на сервере создает команду вставки, обновления или удаления записей из базы данных.

По умолчанию код задает свойству «Подготовленный» объекта команды значение true , то есть сервер приложений может многократно использовать простую откомпилированную версию объекта при каждом выполнении команды. Для изменения этой настройки переключитесь в представление кода и измените значение свойства «Подготовленный» на false .

О хранимых процедурах

Хотя для создания страниц, изменяющих базы данных, можно использовать поведения сервера, с этой целью также можно применять такие объекты операций с базами данных, как хранимые процедуры или объекты ASP-команд.

Хранимая процедура представляет собой многократно используемый элемент базы данных, выполняющий некоторую операцию с базой данных. Хранимая процедура содержит SQL-код, способный среди прочего вставлять, обновлять или удалять записи. Хранимые процедуры также могут изменять структуру самой базы данных. Например, хранимые процедуры можно применять для добавления в таблицу столбца или даже для удаления таблиц.

Хранимая процедура может вызывать другие хранимые процедуры, а также принимать параметры ввода и возвращать значения в вызывающую процедуру в форме выходных параметров.

Хранимая процедура является многократно используемой в том смысле, что простую откомпилированную версию процедуры можно использовать для многократного выполнения операции с базой данных. Если известно, что операция с базой данных будет выполняться много раз или одна задача будет выполняться различными приложениями, применение хранимой процедуры для выполнения этой операции повышает эффективность работы базы данных.

Базы данных MySQL и Microsoft Access не поддерживают хранимые процедуры.

Добавление хранимой процедуры (ColdFusion) (CS6)

Хранимую процедуру можно использовать для изменения базы данных. Хранимая процедура представляет собой многократно используемый элемент базы данных, выполняющий некоторую операцию с базой данных.

Перед изменением базы данных при помощи хранимой процедуры убедитесь, что в процедуре содержится SQL-код для некоторого изменения базы данных. Более подробную информацию о создании и размещении хранимых процедур в базе данных см. в документации по базе данных и руководство Transact-SQL.

Учебник. Использование перехвата устойчивость и команду подключения с Entity Framework в приложении ASP.NET MVC Tutorial: Use connection resiliency and command interception with Entity Framework in an ASP.NET MVC app

Пока приложение будет выполняться локально в IIS Express на компьютере разработчика. So far the application has been running locally in IIS Express on your development computer. Чтобы реальных приложение стало доступным для других пользователей в Интернете, необходимо развернуть его на веб-поставщик услуг размещения и у вас есть развертывание базы данных на сервер базы данных. To make a real application available for other people to use over the Internet, you have to deploy it to a web hosting provider, and you have to deploy the database to a database server.

В этом руководстве вы узнаете, как использовать перехвата устойчивость и команду подключения. In this tutorial you’ll learn how to use connection resiliency and command interception. Они являются две важные функции Entity Framework 6, которые особенно важны при развертывании в облачной среде: устойчивость подключений (автоматические повторы для временных ошибок) и перехват команд (catch все SQL-запросы, отправляемые базе данных для входа или изменять их). They are two important features of Entity Framework 6 that are especially valuable when you are deploying to the cloud environment: connection resiliency (automatic retries for transient errors) and command interception (catch all SQL queries sent to the database in order to log or change them).

Учебником подключения устойчивость и команда перехвата является необязательным. This connection resiliency and command interception tutorial is optional. Если вы пропустите это руководство, будет лишь небольшие изменения, внесенные в последующих руководствах. If you skip this tutorial, a few minor adjustments will have to be made in subsequent tutorials.


В этом учебнике рассмотрены следующие задачи. In this tutorial, you:

  • Включить устойчивость подключений Enable connection resiliency
  • Включить перехват команд Enable command interception
  • Протестируйте новую конфигурацию Test the new configuration

Предварительные требования Prerequisites

Включить устойчивость подключений Enable connection resiliency

При развертывании приложения в Windows Azure, используется для развертывания базы данных в базу данных SQL Azure Windows, облачная служба баз данных. When you deploy the application to Windows Azure, you’ll deploy the database to Windows Azure SQL Database, a cloud database service. При подключении к облачная служба баз данных, чем при веб-сервер и сервер базы данных непосредственно соединены друг с другом в одном центре обработки данных, временных ошибок подключения обычно чаще. Transient connection errors are typically more frequent when you connect to a cloud database service than when your web server and your database server are directly connected together in the same data center. Даже если веб-сервер cloud и облачная служба баз данных размещаются в одном центре обработки данных, существуют дополнительные сетевые подключения между ними, которые могут возникнуть проблемы, такие как подсистемы балансировки нагрузки. Even if a cloud web server and a cloud database service are hosted in the same data center, there are more network connections between them that can have problems, such as load balancers.

Также это облачная служба обычно совместно используется другими пользователями, это означает, что отклик может зависеть от их. Also a cloud service is typically shared by other users, which means its responsiveness can be affected by them. И доступ к базе данных может быть подвергаются регулированию. And your access to the database might be subject to throttling. Регулирование означает, что служба базы данных создает исключения, при попытке доступа к нему дополнительные часто не допускается в вашей уровень соглашения об уровне обслуживания. Throttling means the database service throws exceptions when you try to access it more frequently than is allowed in your Service Level Agreement (SLA).

Многие или большинство проблем подключения при обращении к облачной службе являются временными, то есть они устранить самостоятельно за короткий период времени. Many or most connection problems when you’re accessing a cloud service are transient, that is, they resolve themselves in a short period of time. Поэтому при попытке выполнения операции базы данных получить тип ошибки, обычно временное, можно попробовать операцию после короткого ожидания и операции может пройти успешно. So when you try a database operation and get a type of error that is typically transient, you could try the operation again after a short wait, and the operation might be successful. Можно предоставить значительно удобней для пользователей, если обработка временных ошибок с автоматически повторить попытку, невидимую большинство из них для клиента. You can provide a much better experience for your users if you handle transient errors by automatically trying again, making most of them invisible to the customer. Функция устойчивости подключений в Entity Framework 6 автоматизирует, что процесс повторного не удалось выполнить SQL-запросов. The connection resiliency feature in Entity Framework 6 automates that process of retrying failed SQL queries.

Функция устойчивости подключений должен быть настроен для определенной базы данных службы: The connection resiliency feature must be configured appropriately for a particular database service:

  • Он должен знать, какие исключения могут быть временными. It has to know which exceptions are likely to be transient. Вы хотите повторить попытку ошибки, вызванные временная потеря в сетевое подключение не ошибки, например из-за ошибок программы. You want to retry errors caused by a temporary loss in network connectivity, not errors caused by program bugs, for example.
  • Она должна ожидать соответствующий период времени между повторными попытками, сбой операции. It has to wait an appropriate amount of time between retries of a failed operation. Вы можете ожидать больше между повторными попытками для пакетной обработки, чем вы можете на интерактивной веб-странице, где пользователь ожидает ответа. You can wait longer between retries for a batch process than you can for an online web page where a user is waiting for a response.
  • Он должен повторить попытку на соответствующее число раз, прежде чем прекратить попытки. It has to retry an appropriate number of times before it gives up. Может потребоваться повторить несколько раз в рамках пакетного процесса, как в интерактивном приложении. You might want to retry more times in a batch process that you would in an online application.

Можно настроить эти параметры вручную для любой среды базы данных, поддерживаемом поставщиком Entity Framework, но уже были настроены значения по умолчанию, которые обычно доступны также в интерактивном приложении, использующем базу данных SQL Azure Windows, и Это параметры, которые вы реализуете для приложения университета Contoso. You can configure these settings manually for any database environment supported by an Entity Framework provider, but default values that typically work well for an online application that uses Windows Azure SQL Database have already been configured for you, and those are the settings you’ll implement for the Contoso University application.

Вам нужно выполнить, чтобы включить устойчивость подключения создать класс в сборке, производный от DbConfiguration и в этом классе присвоить базе данных SQL стратегия выполнения, в EF – еще один термин для политика повтора. All you have to do to enable connection resiliency is create a class in your assembly that derives from the DbConfiguration class, and in that class set the SQL Database execution strategy, which in EF is another term for retry policy.

В папке DAL, добавьте файл класса с именем SchoolConfiguration.cs. In the DAL folder, add a class file named SchoolConfiguration.cs.

Замените код шаблона следующим кодом: Replace the template code with the following code:

Платформа Entity Framework автоматически выполняет код в класс, производный от DbConfiguration . The Entity Framework automatically runs the code it finds in a class that derives from DbConfiguration . Можно использовать DbConfiguration класса, чтобы выполнять задачи по настройке в коде, в противном случае это делается в Web.config файл. You can use the DbConfiguration class to do configuration tasks in code that you would otherwise do in the Web.config file. Дополнительные сведения см. в разделе EntityFramework конфигурация на основе кода. For more information, see EntityFramework Code-Based Configuration.

В StudentController.cs, добавьте using инструкции для System.Data.Entity.Infrastructure . In StudentController.cs, add a using statement for System.Data.Entity.Infrastructure .

Изменить все catch блокирует перехвата DataException исключения, чтобы они перехватывать RetryLimitExceededException исключения вместо этого. Change all of the catch blocks that catch DataException exceptions so that they catch RetryLimitExceededException exceptions instead. Пример: For example:

Вы использовали DataException выявления ошибок, которые могут быть временными, чтобы обеспечить понятное сообщение «повторить». You were using DataException to try to identify errors that might be transient in order to give a friendly «try again» message. Но теперь, когда вы включили политику повтора, единственные ошибки, скорее всего, будут временными будет уже были испытаны и не удалось несколько раз, и фактическое возвращаемое исключение будет вставлено в RetryLimitExceededException исключение. But now that you’ve turned on a retry policy, the only errors likely to be transient will already have been tried and failed several times and the actual exception returned will be wrapped in the RetryLimitExceededException exception.

Включить перехват команд Enable command interception

Теперь, когда вы включили политику повтора, как протестировать чтобы убедиться, что он работает должным образом? Now that you’ve turned on a retry policy, how do you test to verify that it is working as expected? Это не так просто заставить временная ошибка происходит, особенно при работе локально, и было бы особенно трудно интегрировать фактическое временных ошибок в автоматизированные модульные тест. It’s not so easy to force a transient error to happen, especially when you’re running locally, and it would be especially difficult to integrate actual transient errors into an automated unit test. Чтобы протестировать функция устойчивости подключений, нужен способ перехватывать запросы, которые отправляет Entity Framework для SQL Server и замените типа исключения, которое обычно временное ответ от сервера SQL. To test the connection resiliency feature, you need a way to intercept queries that Entity Framework sends to SQL Server and replace the SQL Server response with an exception type that is typically transient.

Перехват запросов также можно использовать для реализации рекомендации для облачных приложений: журнала задержки и успешность всех вызовов к внешним службам такие как службы базы данных. You can also use query interception in order to implement a best practice for cloud applications: log the latency and success or failure of all calls to external services such as database services. Предоставляет EF6 выделенной API ведения журнала , можно упростить его сделать ведения журнала, но в этом разделе руководства вы узнаете, как использовать Entity Framework механизма перехвата напрямую, как для Ведение журнала и для имитации временных ошибок. EF6 provides a dedicated logging API that can make it easier to do logging, but in this section of the tutorial you’ll learn how to use the Entity Framework’s interception feature directly, both for logging and for simulating transient errors.

Создайте класс и интерфейс ведения журнала Create a logging interface and class

Объект рекомендация для ведения журнала — это с помощью интерфейса вместо жестко запрограммированного вызовы методов System.Diagnostics.Trace или класса ведения журнала. A best practice for logging is to do it by using an interface rather than hard-coding calls to System.Diagnostics.Trace or a logging class. Что упрощает изменение вашего механизма ведения позже, если вы захотите это сделать. That makes it easier to change your logging mechanism later if you ever need to do that. Поэтому в этом разделе мы создадим интерфейс ведения журнала и класса для реализации его/p > So in this section you’ll create the logging interface and a class to implement it./p>

Создание папки в проект и назовите его ведение журнала. Create a folder in the project and name it Logging.

В ведение журнала папке создайте файл класса с именем ILogger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named ILogger.cs, and replace the template code with the following code:

Этот интерфейс предоставляет три уровня трассировки, чтобы указать относительную важность журналы и один, предоставляет сведения о задержке для внешней службы вызовы, такие как запросы к базе данных. The interface provides three tracing levels to indicate the relative importance of logs, and one designed to provide latency information for external service calls such as database queries. Методы ведения журнала имеют перегрузки, которые позволяют передавать исключение. The logging methods have overloads that let you pass in an exception. Это так, что сведения об исключении, включая стек трассировки и внутренние исключения надежно регистрируется классом, который реализует интерфейс, а не полагаться на который выполняется в каждом вызове метода ведения журнала в приложении. This is so that exception information including stack trace and inner exceptions is reliably logged by the class that implements the interface, instead of relying on that being done in each logging method call throughout the application.

Методы TraceApi позволяют отслеживать задержку каждого вызова определенной внешней службы, такие как базы данных SQL. The TraceApi methods enable you to track the latency of each call to an external service such as SQL Database.

В ведение журнала папке создайте файл класса с именем Logger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named Logger.cs, and replace the template code with the following code:

Реализация использует System.Diagnostics для трассировки. The implementation uses System.Diagnostics to do the tracing. Это встроенная функция .NET, что позволяет легко создать и использовать данные трассировки. This is a built-in feature of .NET which makes it easy to generate and use tracing information. Существует много «прослушиватели» можно использовать с трассировкой System.Diagnostics записывать журналы к файлам, к примеру, или для записи их в хранилище BLOB-объектов Azure. There are many «listeners» you can use with System.Diagnostics tracing, to write logs to files, for example, or to write them to blob storage in Azure. Некоторые из вариантов, а также ссылки на другие ресурсы, Дополнительные сведения см. в Устранение неполадок веб-сайтов Azure в Visual Studio. See some of the options, and links to other resources for more information, in Troubleshooting Azure Web Sites in Visual Studio. Этот учебник позволяет только просмотреть журналы в Visual Studio вывода окна. For this tutorial you’ll only look at logs in the Visual Studio Output window.

В рабочем приложении может потребоваться учитывать пакеты трассировки, отличный от System.Diagnostics и интерфейс ILogger позволяет относительно легко переключиться на механизм разных трассировки, если вы решили сделать это. In a production application you might want to consider tracing packages other than System.Diagnostics, and the ILogger interface makes it relatively easy to switch to a different tracing mechanism if you decide to do that.

Создайте перехватчик классы Create interceptor classes

Теперь необходимо создать классы, которые Entity Framework будет вызывать каждый раз, когда оно для отправки запроса к базе данных для имитации временных ошибок и сделать ведения журнала. Next you’ll create the classes that the Entity Framework will call into every time it is going to send a query to the database, one to simulate transient errors and one to do logging. Эти классы перехватчик должен быть производным от DbCommandInterceptor класса. These interceptor classes must derive from the DbCommandInterceptor class. В них вы напишете переопределения методов, которые вызываются автоматически в том случае, когда запрос будет выполняться. In them you write method overrides that are automatically called when query is about to be executed. В этих методах можно изучать или запрос, который отправляется в базу данных к журналу, а также можно изменить запрос перед отправкой в базу данных или возвращать результат Entity Framework самостоятельно без даже передача запроса к базе данных. In these methods you can examine or log the query that is being sent to the database, and you can change the query before it’s sent to the database or return something to Entity Framework yourself without even passing the query to the database.

Чтобы создать класс перехватчик, которая будет записывать каждый запрос SQL, который отправляется в базу данных, создайте файл класса с именем SchoolInterceptorLogging.cs в DAL папку и замените код шаблона Следующий код: To create the interceptor class that will log every SQL query that is sent to the database, create a class file named SchoolInterceptorLogging.cs in the DAL folder, and replace the template code with the following code:

Для успешно выполненных запросов или команд этот код записывает в журнал сведения с сведения о задержке. For successful queries or commands, this code writes an Information log with latency information. Для исключений он создает журнал ошибок. For exceptions, it creates an Error log.

Для создания класса-перехватчика, вызывающая фиктивный временных ошибок при вводе «Throw» в поиска поле, создайте файл класса с именем SchoolInterceptorTransientErrors.cs в DAL папку и замените код шаблона следующим кодом: To create the interceptor class that will generate dummy transient errors when you enter «Throw» in the Search box, create a class file named SchoolInterceptorTransientErrors.cs in the DAL folder, and replace the template code with the following code:

Этот код только переопределения ReaderExecuting метод, который вызывается для запросов, которые могут возвращать несколько строк данных. This code only overrides the ReaderExecuting method, which is called for queries that can return multiple rows of data. Если вы хотите проверить устойчивость подключения для других типов запросов, можно также переопределить NonQueryExecuting и ScalarExecuting методы, как ведение журнала перехватчик. If you wanted to check connection resiliency for other types of queries, you could also override the NonQueryExecuting and ScalarExecuting methods, as the logging interceptor does.

При запуске страницы учащихся и введите «Throw» в строке поиска, этот код создает фиктивный исключение базы данных SQL для номер ошибки 20, типом, известным обычно временной. When you run the Student page and enter «Throw» as the search string, this code creates a dummy SQL Database exception for error number 20, a type known to be typically transient. Другие коды ошибок, момент опознаны как временные являются 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501 и 40613, но они могут быть изменены в новые версии базы данных SQL. Other error numbers currently recognized as transient are 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501, and 40613, but these are subject to change in new versions of SQL Database.

Код возвращает исключение в Entity Framework, вместо выполнения запроса и передачи результатов запроса назад. The code returns the exception to Entity Framework instead of running the query and passing back query results. Временное исключение возвращается в четыре раза, а затем код возвращается к обычной процедуры передачи запроса к базе данных. The transient exception is returned four times, and then the code reverts to the normal procedure of passing the query to the database.

Так как все, что в системе, вы сможете см. в разделе Entity Framework пытается выполнить запрос предшествовало в четыре раза, что в приложении отличается только что занимает больше времени для визуализации страницы с результатами запроса. Because everything is logged, you’ll be able to see that Entity Framework tries to execute the query four times before finally succeeding, and the only difference in the application is that it takes longer to render a page with query results.

Количество раз, когда Entity Framework будет повторять попытку настраивается; код определяет четыре раза, потому что это значение по умолчанию для политики выполнения базы данных SQL. The number of times the Entity Framework will retry is configurable; the code specifies four times because that’s the default value for the SQL Database execution policy. Если изменить политику выполнения, необходимо было также изменение здесь расположен код, указывает, сколько раз создаются временные ошибки. If you change the execution policy, you’d also change the code here that specifies how many times transient errors are generated. Можно также изменить код, чтобы создать дополнительные исключения, чтобы платформа Entity Framework вызывает исключение RetryLimitExceededException исключение. You could also change the code to generate more exceptions so that Entity Framework will throw the RetryLimitExceededException exception.

Значение, указанное в поле поиска будет находиться в command.Parameters[0] и command.Parameters[1] (один используется имя и фамилия). The value you enter in the Search box will be in command.Parameters[0] and command.Parameters[1] (one is used for the first name and one for the last name). Если найдено значение «% Throw %», «Throw» заменяется в эти параметры «», чтобы некоторые студенты будут найдены и возвращается. When the value «%Throw%» is found, «Throw» is replaced in those parameters by «an» so that some students will be found and returned.

Это просто удобный способ проверить устойчивость подключений, в зависимости от изменяющихся некоторые входные данные для пользовательского интерфейса приложения. This is just a convenient way to test connection resiliency based on changing some input to the application UI. Можно также написать код для создания временных ошибок для всех запросов или обновлений, как описано далее в комментарии о DbInterception.Add метод. You can also write code that generates transient errors for all queries or updates, as explained later in the comments about the DbInterception.Add method.

В Global.asax, добавьте следующий using инструкции: In Global.asax, add the following using statements:

Добавьте выделенные строки, чтобы Application_Start метод: Add the highlighted lines to the Application_Start method:

Эти строки кода являются, что вызывает перехватчик кода для запуска в том случае, когда Entity Framework отправляет запросы к базе данных. These lines of code are what causes your interceptor code to be run when Entity Framework sends queries to the database. Обратите внимание, что так как вы создали отдельные перехватчик классы для имитации временных ошибок и ведение журнала, вы можете независимо друг от друга, включить или отключить их. Notice that because you created separate interceptor classes for transient error simulation and logging, you can independently enable and disable them.

Можно добавить с помощью перехватчики DbInterception.Add метод в любом месте кода; он не должен быть в Application_Start метод. You can add interceptors using the DbInterception.Add method anywhere in your code; it doesn’t have to be in the Application_Start method. Другой вариант — поместить этот код в класс DbConfiguration, который был создан ранее, чтобы настроить политику выполнения. Another option is to put this code in the DbConfiguration class that you created earlier to configure the execution policy.

Везде, где поместить этот код, нужно избегать выполнения DbInterception.Add для же перехватчик более чем один раз, или вы получите дополнительные перехватчик экземпляров. Wherever you put this code, be careful not to execute DbInterception.Add for the same interceptor more than once, or you’ll get additional interceptor instances. Например если дважды добавить перехватчик ведения журнала, вы увидите два журнала для каждого запроса SQL. For example, if you add the logging interceptor twice, you’ll see two logs for every SQL query.

Перехватчики выполняются в порядке регистрации (порядок, в котором DbInterception.Add вызывается метод). Interceptors are executed in the order of registration (the order in which the DbInterception.Add method is called). Порядок может имеет значения в зависимости от выполняемых задач в перехватчик. The order might matter depending on what you’re doing in the interceptor. Например, перехватчик может изменить команду SQL, получаемый в CommandText свойство. For example, an interceptor might change the SQL command that it gets in the CommandText property. Если это приводит к изменению команду SQL, далее перехватчик получите измененные команду SQL, не исходную команду SQL. If it does change the SQL command, the next interceptor will get the changed SQL command, not the original SQL command.

Вы написали код имитации временной ошибки способом, который позволяет вызывать временные ошибки, введя другое значение в пользовательском Интерфейсе. You’ve written the transient error simulation code in a way that lets you cause transient errors by entering a different value in the UI. Кроме того можно написать код перехватчик всегда создать последовательность временных исключений без проверки на наличие значения определенного параметра. As an alternative, you could write the interceptor code to always generate the sequence of transient exceptions without checking for a particular parameter value. Затем вы сможете добавить перехватчик только в том случае, если вы хотите создавать временные ошибки. You could then add the interceptor only when you want to generate transient errors. Если в этом случае не добавляйте перехватчик до после завершения инициализации базы данных. If you do this, however, don’t add the interceptor until after database initialization has completed. Другими словами выполните операции по крайней мере одна база данных, например запрос на одном из своего набора сущностей, перед началом создания временных ошибок. In other words, do at least one database operation such as a query on one of your entity sets before you start generating transient errors. Платформа Entity Framework выполняет несколько запросов во время инициализации базы данных, и они не выполняются в транзакции, в случае ошибки во время инициализации может возникнуть контекст которого необходимо получить в несогласованное состояние. The Entity Framework executes several queries during database initialization, and they aren’t executed in a transaction, so errors during initialization could cause the context to get into an inconsistent state.

Протестируйте новую конфигурацию Test the new configuration

Нажмите клавишу F5 запустите приложение в режиме отладки, и нажмите кнопку учащихся вкладки. Press F5 to run the application in debug mode, and then click the Students tab.

Посмотрите на Visual Studio вывода окно, чтобы просмотреть выходные данные трассировки. Look at the Visual Studio Output window to see the tracing output. Может потребоваться прокрутить вверх после некоторых ошибок JavaScript, чтобы получить журналы, сохраняемые в средство ведения журналов. You might have to scroll up past some JavaScript errors to get to the logs written by your logger.

Обратите внимание на то, что вы видите фактические SQL-запросы, отправляемые в базу данных. Notice that you can see the actual SQL queries sent to the database. Вы увидите некоторые начальные запросы и команды, которые Entity Framework выполняет обновление, чтобы приступить к работе, проверка версии базы данных и таблицы журнала миграции (вы узнаете о миграции в следующем учебном курсе). You see some initial queries and commands that Entity Framework does to get started, checking the database version and migration history table (you’ll learn about migrations in the next tutorial). Появится запрос для разбиения на страницы, чтобы узнать, сколько учащихся, и наконец видеть запрос, который получает данные об учащихся. And you see a query for paging, to find out how many students there are, and finally you see the query that gets the student data.

В учащихся странице введите «Throw» в строке поиска и нажмите кнопку поиска. In the Students page, enter «Throw» as the search string, and click Search.

Вы заметите, что браузер кажется зависает на несколько секунд, пока Entity Framework повторением запроса несколько раз. You’ll notice that the browser seems to hang for several seconds while Entity Framework is retrying the query several times. Первый Повтор происходит очень быстро, затем ожидать увеличения перед каждой следующей попытки. The first retry happens very quickly, then the wait before increases before each additional retry. Процесс больше ожидания перед каждым повтором называется экспоненциального откладывания. This process of waiting longer before each retry is called exponential backoff.

При отображении страницы отображение учащиеся имеют «значение» в именах, посмотрите в окно вывода, и вы увидите, что тот же запрос количество предпринятых попыток пяти, первые четыре раза возвращением временных исключений. When the page displays, showing students who have «an» in their names, look at the output window, and you’ll see that the same query was attempted five times, the first four times returning transient exceptions. Для каждой временной ошибки вы увидите журнала, создаваемого при создании временной ошибке в SchoolInterceptorTransientErrors класс («возвращение временная ошибка команды. ») и вы увидите журнала, записанных при SchoolInterceptorLogging возвращает исключение. For each transient error you’ll see the log that you write when generating the transient error in the SchoolInterceptorTransientErrors class («Returning transient error for command. «) and you’ll see the log written when SchoolInterceptorLogging gets the exception.

Так как вы ввели строку поиска, параметризован запрос, который возвращает данные об учащихся: Since you entered a search string, the query that returns student data is parameterized:

Значения параметров не выполняется вход, но это можно сделать. You’re not logging the value of the parameters, but you could do that. Если вы хотите просмотреть значения параметра, можно написать код ведения журнала, чтобы получить значения параметров из Parameters свойство DbCommand объект, который вы получаете в методы перехватчика. If you want to see the parameter values, you can write logging code to get parameter values from the Parameters property of the DbCommand object that you get in the interceptor methods.

Обратите внимание на то, что нельзя повторите этот тест, если вы остановите приложение и перезапустите его. Note that you can’t repeat this test unless you stop the application and restart it. Если вы хотите иметь возможность тестировать устойчивость подключения несколько раз в рамках одного запуска приложения, можно написать код, чтобы сбросить счетчик ошибок в SchoolInterceptorTransientErrors . If you wanted to be able to test connection resiliency multiple times in a single run of the application, you could write code to reset the error counter in SchoolInterceptorTransientErrors .

Чтобы увидеть разницу стратегии выполнения (политика повтора) делает, комментарий SetExecutionStrategy строку в SchoolConfiguration.cs, снова запустите на страницу учащихся в режиме отладки и повторить поиск «Throw». To see the difference the execution strategy (retry policy) makes, comment out the SetExecutionStrategy line in SchoolConfiguration.cs, run the Students page in debug mode again, and search for «Throw» again.

Это время отладчик останавливается на первой порожденное исключение немедленно в том случае, когда предпринимается попытка выполнения запроса в первый раз. This time the debugger stops on the first generated exception immediately when it tries to execute the query the first time.

Раскомментируйте SetExecutionStrategy строку в SchoolConfiguration.cs. Uncomment the SetExecutionStrategy line in SchoolConfiguration.cs.

Получение кода Get the code

Дополнительные ресурсы Additional resources

Ссылки на другие ресурсы Entity Framework можно найти в доступ к данным ASP.NET — рекомендуемые ресурсы. Links to other Entity Framework resources can be found in ASP.NET Data Access — Recommended Resources.

Следующие шаги Next steps

В этом учебнике рассмотрены следующие задачи. In this tutorial, you:

  • Устойчивость подключения включено Enabled connection resiliency
  • Перехват поддержкой команд Enabled command interception
  • Тестирование новой конфигурации Tested the new configuration

Перейдите к следующей статьи вы узнаете о Code First migrations и развертывание Azure. Advance to the next article to learn about Code First migrations and Azure deployment.

Илон Маск рекомендует:  Администрирование баз данных
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL