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

В девятнадцатом выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов, разработанных с использованием платформы .Net,


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

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

Содержание
  1. От автора
  2. Обзор новостей
  3. Статья выпуска - Отслеживаем пользователя на страницах сайта с помощью ASP.Net (начало)
  4. Время кода - Динамическое добавление DSN
  5. Форумы .Net на www.sql.ru

От автора

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

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

Параметр Значение
C* Значение выводится в денежном формате.
D Выводятся десятичные значения. Если после буквы указано число, то оно будет означать количество выводимых знаков.
E Вывод числа в экспоненциальном виде.
F Фиксированная точность.
G Общий формат.
N Форматирует число с использованием разделителей между разрядами.
X Вывод значения в шестнадцатиричном виде.
* такой же эффект дают строчные буквы

Вот как всё это выглядит в коде -

static void Main(string[] args)
{
int i = 1000;
decimal j = 1000.05M; < BR >
Console.WriteLine("Итого : {0:c}", i);
// Итого : 1 000,00 р.
Console.WriteLine("Итого : {0:c}", j);
// Итого : 1 000,05 р.

Console.WriteLine("Итого : {0:D10}", i);
// Итого : 0000001000

Console.WriteLine("Итого : {0:E}", i);
// Итого : 1,000000E+003
Console.WriteLine("Итого : {0:E}", j);
// Итого : 1,000000E+003

Console.WriteLine("Итого : {0:F}", i);
// Итого : 1000,00
Console.WriteLine("Итого : {0:F}", j);
// Итого : 1000,05

Console.WriteLine("Итого : {0:G}", i);
// Итого : 1000
Console.WriteLine("Итого : {0:G}", j);
// Итого : 1000,05

Console.WriteLine("Итого : {0:N}", i);
// Итого : 1 000,00
Console.WriteLine("Итого : {0:N5}", i);
// Итого : 1 000,00000
Console.WriteLine("Итого : {0:N}", j);
// Итого : 1 000,05
Console.WriteLine("Итого : {0:N5}", j);
// Итого : 1 000,05000

Console.WriteLine("Итого : {0:X}", i);
// Итого : 3E8 }

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

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

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

  1. Вышел Aspose.Office 2.0
    Набор компонет, включающий компоненты для чтения и записи в файлы MS Office – такие, как Aspose.Excel, Aspose.Word, Aspose.PowerPoint и Aspose.Project.
  2. Вышел TransKing 1.56, доступен к бесплатной загрузке
    TransKing – это инструмент для конвертирования проектов VB и VB.NET в проекты на C# одним щелчком мыши.
  3. ComponentOne® выпускает ComponentOne Doc-To-Help 7.2 Professional
    Новая профессиональная версия Professional 7.2 экономит время разработчиков на платформе .NET путём автоматизации документирования объектной модели и т.п.
  4. Вышла Nevron Diagram для WinForms 3.0
    Профессиональный компонент для визуализации диаграмм для Windows Forms, который годится для отображения графиков, диаграмм, моделей БД и т.д.
  5. CenterSpace Software анонсировала NMath Stats 2.0
    CenterSpace Software начала поставки NMath Stats 2.0, мощной библиотеки .NET, поддерживающей статистические вычисления.
  6. Вышел Graphics Server .NET 2.0
    Graphics Server Technologies, LP объявила о выходе Graphics Server .NET 2.0. Этот новый апгрейд содержит много инноваций, среди которых Design Time Click and Drag.
  7. Новая статья: Программное использование Windows Clipboard
    Windows использует Clipboard для хранения данных, которые необходимо передать из одного приложения в другое. Чаще всего вы используете знаменитые Ctrl+X, Ctrl+C и Ctrl+V для вырезания, копирования и вставки данных. Однако, иногда вам может быть необходимо вставить данные в клипбоард через код. В этом случае можно использовать класс Clipboard…
  8. Доступен плагин VSCmdShellWindow Visual Studio 2003
    Плагин для Visual Studio 2003 (да и скорее всего для 2005) , VSCmdShellWindow – это инструмент, создающий оболочку cmd.exe внутри IDE. Он позволяет вам выполнять команды Visual Studio из вашего текущего каталога.
  9. Вышла документация для SQL Server 2005 Express
    На сайте Microsoft Download Center появилась документация по SQL Server 2005 Express (наследника MSDE) .
  10. Вышел Aspose.Component 2.0
    Набор компонент, включающий такие комопненты, как Aspose.Excel, Aspose.Word, Aspose.PowerPoint, Aspose.Project, Aspose.Pdf, Aspose.Chart, Aspose.Spell, Aspose.Recurrence.
BUGs, FIXes and HOW TO's -
  1. FIX: A System.ArgumentException exception occurs when you try to create a Windows form that inherits from a Windows form that contains a dataset
  2. "Argument '3': cannot convert from 'System.TimeSpan' to 'System.Management.ObjectGetOptions'" error message when you use the System.Management.ObjectGetOptions enumeration in Visual C# .NET
  3. The ASP.NET worker process restarts before the timeout setting has lapsed
  4. How to handle Office PowerPoint 2003 events by using Visual Basic .NET 2003
  5. How to sum the fields in a Windows Forms DataGrid control and display the calculated totals in a footer by using Visual C# .NET

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

Статья выпуска

Отслеживаем пользователя на страницах сайта с помощью ASP.Net (начало) 

ЯЗЫК: C#, ASP.Net
Автор статьи: Vikram http://www.codeproject.com/
Код к статье : Демонстрационный проект


Вступление

В этой статье рассказывается о том, каким образом можно отслеживать ASP.NET страницы в своем веб-приложении без использования внешних отслеживающих инструментов. Прочитав эту статью, вы сможете самостоятельно выполнять такое отслеживание, что, однако, не избавит вас от использования внешних инструментов, но даст возможность иметь свой собственный инструмент отслеживания, с которым вы можете поиграться и модифицировать его для удовлетворения собственных нужд.
В поисках людей, разрабатывавших подобный код, я наткнулся на статью Wayne Plourde, в которой объяснялось, как отслеживать веб-страницы в ASP.NET. К написанию этой статьи меня и подвигла статья Wayne Plourde, которую я и рекомендую сначала вам прочитать для понимания основных концепций.
Когда я портировал код Wayne Plourd'а с VB.NET на C#, я застрял на нескольких проблемах, касавшихся сессионных состояний и способом их обработки в каркасе .NET архитекторами Microsoft. После долгих раздумий я описал эту проблему и поделился своими мыслями с сообществом CodeProject. А теперь у меня есть прекрасная возможность поделиться своими мыслями и с вами, поскольку я меняю работу.
Когда я опубликовал свое резюме в поисках новой работы, то мне захотелось использовать свои методы отслеживания посещения веб-страниц. Я был обескуражен тем, что люди задерживаются от двух до десяти секунд на страничке с резюме и, если оно не привлекает их внимания, они к ней больше никогда не возвращаются.

Location - Location - Location

Как веб-разработчику, мне захотелось узнать местонахождение посетителей веб-сайта. Также это важно для бизнеса – ради возможности соответствующим образом влиять на целевую аудиторию. В простейшем сценарии, я заинтересован в информации о местонахождении людей, читающих мое резюме, только из любопытства.
На сайте CodeProject есть несколько статей, посвященных обнаружению географического расположения посетителей по известному IP-адресу. Мне нравится GeoBytes, поскольку они предоставляют бесплатный сервис для некоммерческого использования, который представляет из себя код, вставляемый в вашу страницу для приветствия посетителей вашего сайта.
Мне же этого было мало, поскольку я хотел сохранять географическое местонахождение посетителей для статистического анализа по шаблону посетителей. В настоящее время GeoBytes не предлагает веб-сервис в виде метода, в который вы передаете IP-адрес из вашего веб-сервера, после чего вам возвращается географическое расположение. Для этого нужно немного поработать...
Стартовую страницу назовём index.html.

<html>
<body>
<script language="Javascript"
src="http://gd.geobytes.com/Gd?after=-
1&variables=GeobytesCountry,GeobytesCity,GeobytesRegion">
</script>
<script language="javascript">
if(typeof(sGeobytesCountry) != "undefined" &&
typeof(sGeobytesRegion) != "undefined" &&
typeof(sGeobytesCity) != "undefined")
{
var url = 'index.aspx?IPCity='+sGeobytesCity+'&IPRegion='+
sGeobytesRegion+'&IPCountry='+sGeobytesCountry;
document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL="+url+"'>");
} else
{
document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.aspx'>");
}
</script>
</body>
</html>

Из выше приведенного HTML-кода ясно, что мы обращаемся к сайту GeoBytes, который возвращает нам город, регион и страну, исходя из полученного IP-адреса, отправленного в HTTP-запросе. После это мы вызываем нашу обычную стартовую ASPX-страницу и передаем эти три параметра в строке запроса. Теперь мы имеем необходимую информацию и используем ее для анализа или перенаправления пользователя на страницу, соответствующую его местонахождению. Это подходящий способ для некоммерческого использования, но для серьезных сайтов вам будет необходима своя собственная база данных, содержащая список географических локаций.
Для того, чтобы запустить демонстрационный проект на вашей машине, пожалуйста, убедитесь в том, что вы указали index.html как документ по умолчанию в вашей MMC-оснастке IIS.

Проблемы с сессионным состоянием

Если вы разрабатываете масштабируемое веб-приложение в ASP.NET, то рано или поздно вам придется изменить ваше сессионное состояние с InProc на StateServer или SQLServer. Во время изучения ASP.NET мы всегда использовали сессии InProc, однако потом нам приходилось изменять сессионное состояние на StateServer – из соображений масштабируемости. Есть прекрасный FAQ по Session State от Patrick Y. Ng на сайте ASP.NET и он стоит того, чтобы быть прочитанным, поскольку в нем подробно рассказано о сессионном состоянии.

Если вы все же используете сессии в режиме InProc, то статья Wayne Plourde'а пригодится вам для отслеживания страниц. Я должен был внести некоторые изменения в концепции отслеживания веб-страниц для соответствия сессионному состоянию StateServer, поскольку:
  1. Событие Session_End не поддерживается в режиме StateServer или SQLServer.
  2. При использовании режима StateServer или SQLServer объекты должны быть сериализованы.
Код статьи работает для всех трех случаев сессионных состояний. Таким образом вы можете сделать этот код частью своей собственной стандартной библиотеки классов и получить возможность отслеживания страниц, вписав всего несколько строк в ваш файл web.config.

Отслеживание страниц ASP.NET

Я не ставил себе целью заново изобрести отслдеживание страниц в ASP.NET. Все, что я хотел – всего лишь заставить работать код Wayne's для всех трех случаев. Я перечислил изменения, которые я сделал в этом коде из-за ограничений, указанных выше.

  1. Сымитировать событие Session_End в режиме StateServer или SQLServer Session путем создания объекта кэша с событием, которое произойдет точно в момент окончания сессии
  2. Этот подход имеет свои недостатки, поскольку объекты сессии будут уже недоступны при имитации события session_end, т.к. ASP.NET уже уничтожит сессию к тому моменту, когда мы попытаемся получить к ней доступ.
  3. Мы имитируем объект сессии путем создания простой статической хэш-таблицы, в которой будут находиться наши объекты до прекращения существования сессии.
Основы отслеживания страниц по Wayne'у
  1. Создадим класс Session Tracker
  2. Сохранить этот класс в сессии ASP.NET
  3. Использовать куки для хранения предыдущих значений переменных, которые мы хотим отслеживать
  4. Обновлять класс-отслеживатель в сессии при посещении странички пользователем
  5. Публиковать данные при возникновении событий session_start и session_end
  6. Отображать итоговую страницу статистики посещений по окончании сессии
Модификации к подходу Wayne'а для всех трёх сессионных состояний
  1. Создать класс Tracker для модифицированной сессии.
  2. Симулировать событие session_end по окончании сессии.
  3. Сохранить этот класс в статической хеш-таблицы при посещении страницы пользователем.
  4. Обновить класс – отслеживатель в статической хеш-бталице при посещении страницы пользователем.
  5. Публиковать данные при возникновении событий session_start и session_end
  6. Отображать итоговую страницу статистики посещений по окончании сессии
Global.asax vs HttpModule

В файле global.asax.cs содержатся методы выполняющиеся в ответ на определенные события. Каждое веб-приложение содержит свой собственный файл global.asax.cs, но я не использую этот файл, а в место него использую HTTP Module по следующим причинам:

  1. Http Module может быть многократно использован в различных веб-приложениях, разрабатываемых вами.
  2. Нет необходимости копировать код из одного файла global.asax нашего веб-приложения в другое веб-приложение, если код должен быть одинаков для всех таких приложений.
  3. Храним общий код в своей собственной библиотеке и используем эту библиотеку во всех веб-приложениях

Регистрируем наш HttpModule

В моем демонстрационном проекте есть небольшая библиотека EADFramework. EAD расшифровывается как Enterprise Application Development. Создайте ссылку на эту библиотеку классов в своем веб-проекте. Модифицируйте файл web.config для регистрации HttpModule и установите параметры используемые вашим Page Tracking.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MailFrom" value="yourMailFrom@yourserver.com" />
<add key="MailTo" value="yourMailTo@yourserver.com" />
<add key="SmtpServer" value="smtp.yourmailserver.com" />
<add key="SiteTracking" value="Full" />
<add key="ExcludeIPList" value="127.0.0.1,10.,192.168,172.16" />
</appSettings>
<system.web>
<httpModules>
<add name="EADHttpModule" type="EAD.Controller.EADHttpModule, EADFramework" />
</httpModules>
<compilation defaultLanguage="c#" debug="true" /> <br><trace enabled="false" requestLimit="10" pageOutput="false" traceMode= "SortByTime" localOnly="true"/><br><sessionStatemode="StateServer"stateConnectionString="tcpip=127.0.0.1:42424" timeout="20" />
</system.web>
</configuration>


Вы можете включить и выключить отслеживание путем установки значения переменной SiteTracking на "Full" или "None". В моем собственном наборе библиотек я так же использую значения "Partial", для отслеживания избранных страниц. Отслеживание избранных страниц - сама по себе отдельная, большая тема для обсуждения. Для этого я использую отдельный класс, задействовав атрибуты определенные в файле web.config. Одним из атрибутов для навигации по страницам является атрибут PageVisit, когда он установлен в 'true', то он включает отслеживание страниц для этой страницы. С целью упростить статью, я не стал приводить здесь код для отслеживания избранных веб-страниц, одноко скажу, что я использую метод PageVisit класса PageTrackerUtil для контролирования, отслеживания избранных страниц.
Вы можете указать ExcludeIPList в качестве фильтра ваших локальных или внешних адресов IP, которые вы будете отслеживать. Так же вы можете отслеживать один или более адресов IP, используя IncludeIPList. Используйте IncludeUserList и ExcludeUserList для просмотра CSV пользователей которые должны быть отслежены или, наоборот, исключены из мониторинга.
Сессионное состояние установлено в StateServer. При запуске демонстрационного проекта убедитесь в том, что сервис ASP.NET State Service запущен на вашем веб-сервере.

(окончание в следующем номере)

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

Время кода

Динамическое добавление DSN

ЯЗЫК: C#
АВТОР: Bas Goedemans,
http://www.codeproject.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Вступление

Начнём с того, что обычно я использую OLEDB-соединение к БД. Но после того, как я столкнулся с ошибкой в .NET Framework (в европейской, в моём случае датской версии, теряется десятичный разделитель из-за того, что это не точка). У меня просто не было другого выбора и я стал использовать ODBC – в нём такой ошибки нет. Всё бы ничего, если бы не эти чёртовы DSN-имена. У меня не было никакого желания добавлять DSN-имена вручную, я обшарил всю сеть и… не нашёл ничего. После того, как я получил несколько подсказок на форуме Microsoft, я решил написать эту статью. Используем вызовы функций API для динамического создания имён DSN.

Строим класс

Импорт API

Для того, чтобы импортировать ODBCCP32.dll, которая и содержит необходимую функцию API, мы должны добавить ссылку на пространство имён InteropServices.

using System.Runtime.InteropServices;

Теперь можно импортировать dll и создать наше свойство:

[DLLImport("ODBCCP32.dll")]
private static extern bool SQLConfigDataSource(IntPtr parent, int request, string driver, string attributes);

Параметр parent ссылается на хэндл родительского окна и может быть установлен в 0. Параметр request является числом от 1 до 6 и обозначает запрашиваемое действие. Вот список этих действий:

  1. ODBC_ADD_DSN (используется для добавления пользовательского DSN)
  2. ODBC_CONFIG_DSN (используется для конфигурирования пользовательского DSN)
  3. ODBC_REMOVE_DSN (используется для удаления пользовательского DSN)
  4. ODBC_ADD_SYS_DSN (используется для добавленияuse системного DSN) ODBC_CONFIG_SYS_DSN (используется для конфигурирования системного DSN)
  5. ODBC_REMOVE_SYS_DSN (используется для удаления системного DSN)
Параметр driver содержит имя драйвера, а параметр attributes - путь к БД и другую информацию для логина к ней.

Создаём другие методы

Теперь можно создать и методы, которые потом с лёгкостью можно использовать. Давайте предположим, что мы будем всегда подсоединяться к БД Microsoft Access. В этом случае нам необходимо знать только имя DSN и путь к БД. Итак, наш метод AddUserDSN будет выглядеть так:

public bool AddUserDSN(string DSName, string DBPath)
{
returnSQLConfigDataSource((IntPtr)0,1,"MicrosoftAccessDriver(*.MDB)\0","DSN="+DSName+"\0Uid=Admin\0pwd=\0DBQ=" + DBPath + "\0");
}

Этот метод вернёт true, если действие будет выполнено успешно. Теперь мы можем так вызвать наш метод:

DSNAdmin.AddUserDSN("MyDSNName", @"C:\MyDBPath\MyDB.mdb");

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

Здесь можно скачать код для этого примера.


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

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

Как IErrorInfo.GetDescription failed with DB_E_NOLOCALE(0x80040E41). Как сохранить данные из ADO Recordset, что бы распечатать?
По поводу нового форума
добавление удаление в DataGrid
Генерация Exel с помощью ASP
Работа с SVGView
чем отличается объявление скрипта в заголовке страницы от объявления в теле?
FronPage Server Extensions
передача параметров при загрузке страницы
Не могу прочитать из АД !?!
Unable to create a new web project
WinForm - подскажите, можно ли печатать с prinpreviewDialog xls-файлы?
как научить TcpListener видеть нескольких клиентов?
Как определить высоту в пикселях TaskBar-а ?
cmd.executeNonQuery возвращает после ~20-30 секунд...


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



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


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

http://subscribe.ru/
E-mail: ask@subscribe.ru
Адрес подписки
Отписаться

В избранное