воскресенье, 27 ноября 2011 г.

Сессия ASP.NET и проблема с параллельными запросами

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

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

В принципе, ситуация с конкурентными запросами в рамках одной сессии описана в статье MSDN ASP.NET Session State Overview. Но есть нюансы. Во-первых, это один неприметный абзац в конце статьи (вместо выделенного блока в начале). Во-вторых, MSDN не раскрывает многих неочевидных моментов. И, что важно, ни один из моих знакомых ASP.NET разработчиков не знал об этой особенности.

Заинтересовались? Тогда продолжаем. Я сформулирую несколько правил работы сессии и покажу на примере, что они верны.

четверг, 13 октября 2011 г.

ASP.NET MVC MiniProfiler

Всем доброго времени суток. Сегодня я хочу рассказать про ASP.NET MVC MiniProfiler. А первое, что я хочу рассказать, это то, что, вопреки распространённому мнению и названию, этот профайлер вполне можно применять для отладки обычных (не MVC) ASP.NET приложений. Дальше я на примере покажу как это сделать. А пока обо всем по порядку.

Что такое MiniProfiler?

Это способ отладить ASP.NET-приложение на production (или, если вам больше нравится, “приложение, находящееся в промышленной эксплуатации”). И, что важно, не сильно влияя на производительность (то, что это работает на сайтах платформы StackExchange как бы намекает).

Вкратце процесс подключения выглядит так:

  1. Добавляется ссылка на dll.
  2. Подключается в “Master Page” или любое другое подходящее место одна строчка по инициализации UI.
  3. В Global.asax.cs прописываются вызовы по старту и остановке профайлера.
  4. Либо добавляются вызовы Step(string) там, где вам интересно, либо “сбоку” добавляются фильтры (вроде ProfilingActionFilter), чтобы не модифицировать код.

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

  • Суммарное время.
  • Время на дочерние действия (пункт 4) и запросы к БД.
  • Показать/скрыть “тривиальные” запросы (с маленькими затратами времени).
  • Переслать ссылку на отчет (данные хранятся в кэше).

Заинтересовались? Тогда продолжим…

четверг, 29 сентября 2011 г.

Удобное и надежное хранение паролей


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

История

Лет 15 назад паролей у меня было немного – интернет тогда еще не проник в мелкую бытовую технику :) Время шло, менялись работодатели, множились проекты, открывались новые нужные и ненужные сервисы… И лет 7 назад я понял, что держать важные пароли в голове мне надоело, даже учитывая их “генерацию” по определенным правилам. Альтернатива же использовать одинаковые пароли для разных сервисов была отметена задолго до этого :)

четверг, 16 июня 2011 г.

Model scaffolding для MVC 3 – идеи и принципы

Эта статья является логическим продолжением статей ASP.NET MVC 3 + Entity Framework 4.1 Code First, MVC 3 + scaffolding и моей презентации на TechDays “Пример разработки сайта на MVC 3”. В ней я расскажу про свой пакет для scaffolding’а Model Scaffolding for ASP.NET MVC.

Как я уже говорил ранее, идея написать этот пакет появилась после знакомства с проектом MvcScaffolding. Если вкратце, это пакет NuGet (минимальную необходимую информацию по NuGet и MvcScaffolding я привел в предыдущей статье), позволяющий быстро генерировать контроллеры и представления. Для первого знакомства с MvcScaffolding достаточно прочитать статьи автора “Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package” и “MvcScaffolding: Standard Usage”, а заинтересовавшимся после первого знакомства, рекомендую читать эту серию статей дальше.

Для понимания дальнейшего изложения знакомство с MvcScaffolding не требуется, однако для более глубоко понимания потенциальных возможностей как MvcScaffolding так и ModelScaffolding оно будет весьма полезно. Далее я расскажу про ModelScaffolding по порядку, не забыв объяснить идеи и цели, которые лежат в его основе.

Disclaimer

Я не претендую на особую оригинальность и/или полезность своего подхода к scaffolding’у моделей. Я просто знаю, что есть круг задач которые он решает хорошо, а, на момент создания проекта на CodePlex, сходу не нашел аналога в рамках используемых технологий.

К слову о “круге задач” – на мой взгляд, это прототипирование, причем необязательно “чистое прототипирование” (когда прототип гарантированно не будет использован в промышленной разработке). А самая идеальная задача – набор сущностей со стандартными названиями свойств и большим количеством простых справочников. К концу этой статьи вы поймете почему, а пока запаситесь терпением ;)

вторник, 31 мая 2011 г.

MVC 3 + scaffolding

А теперь обещанное продолжение статьи ASP.NET MVC 3 + Entity Framework 4.1 Code First. Сегодня я расскажу про то, как быстро создать основу (или прототип) для приложения на ASP.NET MVC 3, в том числе, с помощью NuGet-пакета MvcScaffolding. Надо сказать, что принципы MvcScaffolding пришлись мне по душе и даже вдохновили меня на написание своего пакета для scaffolding’а - Model Scaffolding for ASP.NET MVC. О нем я расскажу в следующих статьях.

Поскольку в прошлой статье я уже рассказал про основные понятия и библиотеки (ASP.NET MVC, Entity Framework), сейчас я не буду на них подробно останавливаться. Пример будет использовать scaffolding, который я уже упоминал в предыдущий раз.

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

NuGet

Пожалуй, единственное, на чем я забыл остановиться в прошлый раз, это NuGet. Сама идея его не нова (apt-get, Ruby Gems и т.п.), однако то, что это теперь доступно и в Visual Studio очень радует. Следуя описанию с официального сайта:

NuGet is a Visual Studio extension that makes it easy to install and update open source libraries and tools in Visual Studio.

В принципе, добавить нечего, однако я все-таки немного добавлю :)

среда, 11 мая 2011 г.

ASP.NET MVC 3 + Entity Framework 4.1 Code First

Как вы все знаете, недавно вышло обновление MVC 3 Tools, ключевой особенностью которого является более продвинутый scaffolding. Кстати, scaffolding теперь есть и для движка Razor, что тоже плюс. Об этом, а также о недавнем обновлении Entity Framework я сегодня и расскажу. В этой статье речь пойдет про сами обновления, а в следующей будут примеры использования.

Забегая вперед скажу, что scaffolding (по крайней мере, в случае ASP.NET MVC) это возможность быстро генерировать простую логику и интерфейс, которую можно использовать как прототип или в качестве отправной точки в дальнейшей разработке. Также этот подход может работать почти в чистом виде для простого административного интерфейса.

MVC (Model-View-Controller)

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

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

понедельник, 25 апреля 2011 г.

SQL – execution plan

Перейдя от рассказа про основы SQL к более сложным вещам, я уже успел упомянуть план выполнения (execution plan). Чтобы не останавливаться на этой теме каждый раз, подробнее расскажу о нем в этой статье. Ведь это то, о чем многие разработчики, знакомые с Microsoft SQL Server не один год, либо не знают, либо не придают особого значения.

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

План выполнения

Движку базы данных необходимо знать, в какой последовательности и каким способом соединять таблицы, какие индексы использовать и т.п. Иными словами, перед выполнением запроса необходимо построить (или взять из кэша) план выполнения.

понедельник, 18 апреля 2011 г.

Трюки в SQL – используем CASE

После серии статей “Основы SQL” я решил попробовать вспомнить некоторые нестандартные варианты использования Transact-SQL и начать серию статей “Трюки в SQL”.

В этой статье расскажу прежде всего о полезном но неочевидном использовании выражения CASE. Правда, речь пойдет о достаточно простых приемах (когда их знаешь). Основное содержание:

База данных для примеров

Если в прошлой серии я использовал максимально простую БД, которую создал и наполнил скриптами, то теперь я решил использовать стандартные примеры от Microsoft. Причина в том, что потребуются более сложные структуры и данные, да и примеры станут ближе к реальной жизни.

Поэтому для запуска примера потребуется БД AdventureWorks. Я пользовался облегченной версией для Microsoft SQL Server 2005 (там, в зависимости от версии, можно выбрать AdventureWorksLT.msi или AdventureWorksLT_x64.msi). Скорее всего, подойдут и более поздние версии с CodePlex.

План выполнения

Расскажу на случай, если вы не знаете про план выполнения. В этой статьях этой серии он будет периодически упоминаться. Это пятилетний план выполнения… шутка, надеюсь вашим запросам никогда не придется так долго работать :)