Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В двадцать седьмом выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов, разработанных с использованием платформы .Net, узнать, как провести диагностику приложения и сделать запись в лог, как экспортировать данные в файл XML в SQL Server 2005, а также посмотреть сравнение операции конкатенции строк в сравнении с использованием класса StringBuilder. Со списком вопросов, оставшихся без ответа на форумах .Net сайта http://www.sql.ru/ можно ознакомиться как всегда - в конце номера.


Информационный Канал Subscribe.Ru

.Net Собеседник #27

Содержание
  1. От автора
  2. Обзор новостей
  3. Диагностика и запись логов в ASP.NET  
  4. Время кода - Экспорт данных в файл XML в SQL Server 2005
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Решил проверить насколько быстрее происходи операция слияния строк с помощью класса StringBuilder , нежели привычная конкатенция строк. Сказано - сделано. Выглядеть это может так -

using System;
using System.Text;

namespace StringConcatantion
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string s = "";
Console.WriteLine("Начало конкатенции - {0}",DateTime.Now.ToLongTimeString());
for (int i= 0;i<50000; i++)
{
s += i.ToString();
}
Console.WriteLine("Конец конкатенции - {0}",DateTime.Now.ToLongTimeString());

Console.WriteLine("Начало append'a - {0}",DateTime.Now.ToLongTimeString());
// Учитываем все операции - от создания объекта
StringBuilder sb = new StringBuilder();
for (int i= 0;i<50000; i++)
{
sb.Append(i.ToString());
}
// ... и до копирования в строку
string s1 = sb.ToString();
Console.WriteLine("Конец append'a - {0}",DateTime.Now.ToLongTimeString());

}
}
}
// Начало конкатенции - 8:20:55
// Конец конкатенции - 8:22:00
// Начало append'a - 8:22:00
// Конец append'a - 8:22:00

Выводы для конкатенции неутешительные. Если операция с помощью StringBuilder заняла меньше секунды на моей машине, то конкатенция - 1 мин. 5 сек. Причины этого понятны - при конкатенции строк каждый раз создаётся новый объект, так что использование StringBuilder 'a, особенно в опреациях с большим количеством строк, более предпочтительно.

На этом всё - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. С января 2005 г. в Академии АйТи, г. Киев, сертифицированном учебном центре Microsoft, стартует комплексная программа подготовки технических консультантов, инженеров и разработчиков ПО в среде Microsoft.NET.
    2063. Introduction to Microsoft ASP.NET
    Цель курса - научить слушателей создавать простые приложения ASP.NET, динамически создающие содержимое Web страниц.
    1. Работа с ASP.NET
    2. Использование Web элементов управления
    3. Использование ADO.NET для доступа к данным
    4. Отделение кода от содержимого Web страниц
    5. Трассировка на страницах ASP.NET
    6. Использование Web служб
    7. Создание приложения ASP.NET
    Длительность курса: 3 дня (24 часа) Дата начала: 10 января
    2389. Programming with ADO .NET
    Цель курса – помочь разработчикам получить навыки, необходимые для эффективной разработки приложений и Web служб, работающих с данными, с помощью Microsoft ADO.NET, Microsoft SQL Server 2000, и платформы Microsoft .NET.
    1. Приложения, работающие с данными и ADO.NET
    2. Соединение с источником данных
    3. Взаимодействие с открытой базой данных
    4. Создание наборов данных
    5. Чтение и запись XML с помощью ADO .NET
    6. Построение наборов данных из существующих источников
    7. Разработка и использование Web служб, работающих с ADO .NET
    Длительность курса: 3 дня (24 часа) Дата начала: открытая

    Читать курсы буду я, автор этой рассылки - записывайтесь; уверен, что будет интересно.

    Эти курсы входят в программу подготовки к сертификации Microsoft Certified Solution Developer (MCSD, сертифицированный разработчик программных решений на основе продуктов корпорации Microsoft), которая рассчитана на разработчиков, занимающихся проектированием и разработкой передовых решений для бизнеса с использованием средств разработки, платформ и технологий корпорации Microsoft, а также Microsoft.NET Framework.
    Дополнительную информацию Вы можете получить у Ольги Васильевой по телефону (044) 212-02-06,
    e-mail: ovasilieva@it-ua.com.
  2. Вышла новая версия форума DnnBB
    Вышла новая версия 2.0 популярного форума DnnBB. Содержит большое количество нового функционала, включая поддержку анонимных постов, RSS, улучшенная модель безопасности, новые возможности по администрированию. Новая версия содержит простую в освоении систему цитирования, в которой можно контролировать то, что хочется цитировать.
  3. Доступен RichSlider
    Вышла новая версия RichSlider от Richer Components. RichSlider – визуальный слайдер, применяемый для выбора значений и сбора пользовательской информации. Он достаточно прост, настраивается, поддерживает скины, может работать как на стороне сервера, так и на стороне клиента и т.п.
  4. Вышел плагин Express .NET 2.1
    Плагин Express .NET – это визуальный инструмент RAD для создания COM компонентов, смарт-тэгов и серверов RTD в Visual Studio .NET.

{К содержанию}

Диагностика и запись логов в ASP.NET

Диагностика и запись логов в ASP.NET
Что нужно знать перед тем, как приступить к реализации такой функциональности

ЯЗЫК:
Автор статьи: Scott Allen

ПЕРЕВОД: Чужа В.Ф. ака hDrummer


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

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

Сделаем список и дважды проверим его

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

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

Это лишь пример того, что может быть необходимо для работы приложения. Разные приложения будут иметь разные нужды и приоритеты. Например, приложение, отвечающее за безопасность подключения к Сети, должно записывать попытки войти в систему. Запись может содержать неверный логин, дату и время попытки проникновения и IP адрес клиента. Записанная информация может помочь в борьбе с хакером, который пытается с помощью перебора по словарю подобрать логин/пароль к вашему приложению.

Отвечая требованиям

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

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

private void LogException(Exception e)
{
MailMessage mail = new MailMessage();
mail.To = "admin @ odetocode.com";
mail.From = "webserver @ odetocode.com";
mail.Subject = "Exception!!";
mail.Body = ex.ToString();
SmtpMail.Send( mail );
}

Вышеприведенный код содержит очень специфические инструкции. Было бы лучше, если бы он выглядел как метод LogException:

private void LogException(Exception e)
{
LogUtility.Log(LogPriority.High, ex.ToString());
}

Таким образом мы добавили некий абстрактный слой – класс LogUtility. Можно дальше развить воображаемую функциональность такого класса. LogUtility может принимать решение кому писать письмо и писать ли его вообще, на основании введенных параметров. Это решение может базироваться и на значениях переменных конфигурационного файла, такие значения можно менять на лету, добиваясь изменения поведения приложения без перекомпиляции. Конечно, придётся написать немного больше кода для того, чтобы это заработало, но в результате получим большую гибкость и настраиваемость. Есть и библиотеки сторонних производителей, которые могут помочь нам с этим, что мы и рассмотрим чуть позже.

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

Трассировка в ASP.NET

В ASP.NET есть встроенные возможности трассировки на уровне страницы и приложения. Если трассировка разрешена, то вы можете просматривать трассировочную информацию из браузера, поскольку ASP.NET может добавлять её в конец страницы. Данные трассировки включают массу полезной информации, включая время выполнения, размер view state, серверные переменные и их значения, куки, заголовки HTTP, значения переменных, переданных в строке запроса и т.п.

Используя методы объекта Trace ASP.NET (типа System.Web.TraceContext), можно писать в трассировщик собственные сообщения. Трассировка может быть разрешена или запрещена простым редактированием файла web.config file, влиянием Trace.Write можно пренебречь при отключенной трассировке. Вот эта часть файла web.config приводит к разрешению трассировки уровня страницы и приложения.

<configuration>
<system.web>
<trace enabled="true"
requestLimit="20"
pageOutput="true"
localOnly="true" />
<system.web>
</configuration>

Для того, чтобы привести вывод Trace к более приятному виду, а также получить возможность вмешаться в его вывод, можно прочесть статью Dino Esposito “MyTracer Monitors and Traces ASP.NET Apps”.

Трассировку легко включать и выключать, а также она даёт массу полезной информации. Можно ограничить её вывод только для запросов с оопределённых адресов – в целях безопасности.
В то же время данные трассировки могут содержать слишком много информации, в которой могут разобраться только разработчики приложения. Администраторам врядли пригодится информация, доступная благодаря трассировке. А трассировка больших сайтов вообще незавидная вещь, кроме того, она врядли поможет в решении каких-то специфических проблем. Трассировка не включена по умолчанию, поэтому её включение может замедлить работу приложения.

Счётчики производительности

ASP.NET имеет большое количество счётчиков произвордительности для просмотра или записи производительности разных участков приложения. Счётчики производительности бывают не только такими простыми, как количество запросов в секунду и время ожидания ответа. Есть также такие, как количество исключений в сеунду, количество попаданий в кэш, количество активных сессий и отменённых транзакций. Полный список смотрите здесь Performance Counters for ASP.NET
Счётчики производительности – отличное место для отображения часто происходящих событий в вашем приложении. Если у вас есть события, которые происходят несколько раз в секунду, например продажи, возможно вы захотите написать свой собственный счётчик производительности. Для этого прочтите статью “Use Custom Performance Counters from ASP.NET” Ещё одна толкова я статья на тему существующих счётчиков и правильного их использования “ASP.NET Performance Monitoring, and When to Alert Administrators”
Счётчики производительности могут быть хороши при необходимости просмотра суммарных и средних значений для всего приложения на некотором временном отрезке. Многие инструменты, тестирующие производительность, автоматически записывают значения счётчиков для облегчения обнаружения узких мест в использовании ЦП, памяти, диска и т.п. В том случае, если превышается некое установленное значение, можно проинструктировать операционную систему выполнить некое действие.
Хотя счётчики производительности могут быть хорошим инструментом для слежением за общим состоянием системы, они врядли помогут в диагностике какой-то специфической проблемы, например неверного имени БД в строке подсоединения. Такого рода ошибки лучше записывать в журнал событий.

Журнал событий

Журнал событий может быть как источником диагностической информации, так и средством для её хранения. Как уже говорилось выше, нам не хотелось писать в журнал часто обновляющуюся информацию – просто для того, чтобы не забивать его. Правильно составленное сообщение в журнале должно дать администратору точное указание, какая проблема произошла в приложении. Писать всю информацию об исключении пожалуй будет не лучшей идеей, а вот написать “ошибка подсоединения к серверу БД Northwind” вполне может оказать хорошую службу администратору. В статье Rob'a Howard’a “An Exception To The Rule, Part 2” показано, как можно отловить необработанное исключение и записать его в журнал событий.

Журнал событий, являясь локальным ресурсом, будет работать даже тогда, когда нет сетевого соединения и доступ к СУБД или почтовому серверу невозможен. Вот такие ошибки и нужно туда писать. Есть приложения третьих производителей, позволяющие генерировать отчёты на основании журнала событий.

Журналы Веб

Ещё одним третребованием, которое мы предъявляли, было отлавливание сообщений «file not found» (файл не найден).Эту информацию можно найти в логе веб-сервера, вместе с IP-адресом клиента, заголовком HTTP-реферерра (т.е. где лежит неправильная ссылка), кодом HTTP ответа, его размер, время, необходимое для завершения ответа.

Данные, хранящиеся в веб-логе, хороший источник информации, поэтому им тоже стоит воспользоваться. Статья “Configure Web Site Logging in Windows Server 2003” содержит описание процесса конфигурирования с ссылками на подобную информацию для других платформ. Есть много инструментов, как бесплатных, так и платных, для анализа и добычи данных из таких логов. В статье To Use SQL Server to Analyze Web Logs” описано, как построить такой инструмент самостоятельно.

Email, файлы и базы данных

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

Система может записывать сообщения с низким приоритетом в таблицу БД. У этого способа есть свои преимущества перед использованием электронной почты и файловой системы. Во-первых, запись в таблицу БД более надёжна, чем просто отправка сообщения по электронной почте. А во-вторых, база данных может обслуживать сразу множество обращений (как для чтения, так и для записи) и служит единым источникомдля диагностической информации.
Под использованием файловой системы подразумевается запись информации в файлы на тех ПК, где приложение установлено. Поскольку БД может быть недоступна по каким-то причинам, а файловая система всегда в вашем распоряжении. Однако нужно быть внимательным, чтобы не вызвать коллизий записи из разных потоков в один файл. Для этого можно использовать компоненты сторонних производителей.

ПО для ведения логов и диагностики

Есть несколько инструментов, обеспечивающих запись информации. Один из них - log4net, доступен по адресу http://logging.apache.org/log4net/. log4net предлагает слой абстракции, о котором мы говорили ранее. Всё, что надо, делается парой строк вроде:
log.Debug(“This is a debug message”);
log.Info(“This is an informational message”);

Можно сконфигурировать log4net для отсылки сообщений по нескольким адресатам, с помощью конфигурационных настроек. Такими адресатами могут быть провайдер ADO.NET, ASP.NET Trace, адресат электронной почты, журнал событий, пакет UDP и т.п. Следующая запись будет отсылать сообщение в приёмник данных .NET ремотинг по протоколу TCP.

<appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" >
<sink value="tcp://localhost:8085/LoggingSink" />
<lossy value="false" /> <bufferSize value="95" />
<onlyFixPartialEventData value="true" />
</appender>

Ещё одним примером такого ПО может служить ПО с открытым кодом Logging Application Block from Microsoft Последняя версия этого ПО также поддерживает шифрование диагностической информации.

В итоге

В этой статье мы рассмотрели несколько популярных способов по сбору и распространению диагностической информации в ASP.NET (а их ещё очень много!). Три составных успешной диагностики включают: 1) Составление списка требований 2) Соответствие этих требований доступных диагностическим и записывающим возможностям 3) Реализация дополнительного слоя в вашем ПО для создания гибкого, конфигурируемого и эффективного инструмента ведения журналов (логов).

{К содержанию}

Время кода

Экспорт данных в файл XML в SQL Server 2005

ЯЗЫК: C#
АВТОР: Jasper Smith,
Отзывы
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Обзор

В этой статье будет рассказано как скомбинировать интеграцию CLR с улучшенным FOR XML для лёгкой генерации файлов xml из ваших реляционных данных. Для ознакомления с хранимыми процедурами .NET, ознакомьтесь со статьёй Introducing CLR Stored Procedures in SQL Server 2005. В этой статье используется таблица Orders в БД Northwind. Демонстрационные БД для сервера SQL 2005 вы можете найти здесь.

Код .NET

Первым делом надо написать код .Net для нашей хранимой процедуры (ХП) и скомпилировать его. В этом случае мы собираемся создать процедуру, которая принимает в качестве параметра имя файла и некоторое содержимое ( в виде параметра типа nvarchar(max)) и просто пишет это содержимое в файл.

[C#]
using System;
using System.Data.SqlServer;
using System.Data.SqlTypes;
using System.IO;

public class SQLCLRIO{

public static void WriteToFile(String content,String filename)
{
SqlPipe sqlP = SqlContext.GetPipe();
try
{
File.WriteAll(filename, content + "\n");
}
catch(Exception ex)
{
sqlP.Send("Error writing to file : " + ex.Message);
}
} }

Для того, чтобы можно было использовать этот код в SQL Server 2005, для начала необходимо скомпилировать его в виде сборки. Затем мы можем загрузить её в SQL Server и создать TSQL заголовок ХП для нашего кода на .Net. Команда, приведенная ниже, демонстрирует то, каким образом можно скомпилировать код в сборку. В этой статье мы будем считать, что код хранится в файле c:\WriteToFile.vb или c:\WriteToFile.cs. (Примечание: Команда должна быть записана одной строкой)

[C#]
csc /target:library c:\WriteToFile.cs /r:"C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlaccess.dll"

Код T-SQL

Теперь, когда у нас есть сборка (c:\WriteToFile.dll), мы можем загрузить её в SQL Server и создать нашу ХП. Делаем это с помощью новой команды CREATE ASSEMBLY так, как это описано ниже. Нам нужно указать параметр permission_set EXTERNAL_ACCESS, поскольку ХП необходим доступ к файловой системе.

Примечание: доступ будет осуществляться в контексте безопасности учётной записи, под которой работает SQL Server. Не рекомендую давать доступ на выполнение такой ХП обычным пользователям.

create assembly WriteToFile from 'c:\WriteToFile.dll' with permission_set = external_access

Теперь, когда мы загрузили сборку, нужно создать нашу хранимую процедуру. Делаем это с помощью стандартной команды TSQL CREATE PROCEDURE, но вместо написания тела процедуры указываем EXTERNAL NAME, в котором прописываем имя процедуры в сборке .NET в виде <имя_сборки>.<имя_класса>.<имя_метода> :

create procedure writetofile
(
@content nvarchar(max),
@filename nvarchar(255)
)
as external name writetofile.SQLCLRIO.WriteToFile

Теперь, когда ХП создана, можно использовать её для записи содержимого (в нашем случае xml) в файл. Простой запрос вернёт нам содержимое таблицы Northwind.dbo.Orders и создаст правильно сформированный xml-документ, который мы и запишем в файл с помощью ХП WriteToFile. Запрос использует возможность объявления локальных переменных типа LOB - varchar(max) и nvarchar(max) – эти типы данных заменили собой типы text и ntext, а также новую директиву для указания корневого элемента для FOR XML, здесь ею будет <AllOrders>. Этот код создаст новый файл AllOrders.xml, в котором записана вся информация о заказах из БД Northwind. Содержимое файла можно просмотреть в веб-браузере.

declare @xml nvarchar(max)
set @xml = (
select * from Orders
for xml auto,elements,root('AllOrders'))

exec writetofile @xml,'c:\AllOrders.xml'

На этом всё.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

SharePoint Services & MS SQL 2000 проблема с передачей параметров OracleClient
Проблема индексации поисковиками
Научи меня, о всемудрый Гуру, как обойти эту заморочку в
Пример smart device application работы с базой данных
DCOM, COM+
Show WebForm как Popup ?
Вставить изображение в базу (Oracle)

На этом двадцать седьмой выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное