апр 23

Где-то полгода назад я перенёс один из своих сайтов с HostBizUa.com на Hosting.ua, об этом я упоминал в обзоре Hosting.ua. Тогда же я обещал, что напишу причины смены хостера, но, к сожалению, выполнить обещание забыл. Так что буду навёрстывать упущенное и впоминать дела минувшых дней.

Основной причиной ухода от HostBizUa.com было следующее: в определённый момент мне понадобилось сохранять файлы на сервер с сайта, но такой возможности не оказалось, потому что учётная запись под которой крутится IIS  не имела права на запись. Обнаружив это, я написал письмо сапорту:

Доброй ночи.
Такая ситуация: на сайте должна быть возможность добавления файлов. Учётная запись, от имени которой идёт работа в IIS сервере, не имеет прав на запись. Как быть?


от 22.12.07

Ответ:

Это же не Unix хостинг где есть chmod.

Используя Windows хостинг Вы должны были это знать, или хотя бы уточнить.

В этой ситуации можем рекомендовать только использовать Unix хостинг.

-- 

С уважением,

Служба Поддержки HostBizUa

Фраза "Используя Windows хостинг Вы должны были это знать" тогда меня убила наповал. После таких слов у меня пропало желание иметь какие-то дела с данным хостером. В Hosting.ua на тот же вопрос мне ответили:

"Мы по требованию пользователя можем установить права записи ASP.NET на необходимую ему папку. Панель управления этого сделать не позволяет."

Ещё был негативным тот факт, что домен они зарегистрировали на себя, хотя в том же Hosting.ua всё с точностью наоборот.

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

Вот, впринципе, и всё что удалось вспомнить. Выбор за Вами! 

апр 14

Посмотрел на днях презентацию c конференции MIX ASP.NET 4.0: What's Next?, которую проводил Stephen Walter (Senior Program Manager at Microsoft). Должен сказать, что улучшения в следующей версии ASP.NET, а также в Visual Studio 2010, приятно удивили. Что же нового нам готовит ASP.NET 4.0?

ViewState
Как известно, ViewState во всех контролах включен по умолчанию. За частую такоё поведение не нужно, но выключать ViewState разработчики забывают, толи просто ленятся. В ASP.NET 4.0 в класс Control, который явлется базовым для страниц, контролов, добавлено новое свойство ViewStateMode, которое принимает следующие значения:
    - Enabled
    - Disabled
    - Inherit (Default)
Таким образом, если для страницы установить ViewStateMode="Disabled", тогда во всех контролах, находящихся на этой странице, ViewState будет выключен. Если нужно будет включить ViewState для отдельно взятого контрола, ему нужно будет установить ViewStateMode="Enabled".

Control ID
В предидущих версиях ASP.NET контролировал свойство ID, в результате чего его было не возможно использовать в CSS и JavaScript. В новой версии это поведение свойства ID было изменено путём добавления в класс Control свойства ClienIdMode, принимающего следующие значения:
- Legacy (генерация значений ID будет происходить также, как и в предидущих версия, название возможно будет изменено к релизу )
- Static (значение свойства ID остается таким же, каким его установил разработчик)
- Predictable (позволяет добавлять суффикс/префикс к свойству ID, могу ошибаться)
- Inherit (default)

FormView
Если раньше контрол FormView отрисовывался на основе таблиц, что накладывало определённые ограничения в его использовании, то в новой версии FormView добавлено булевское свойство RenderTable. Данное свойство позволяет отключать прорисовку на основе таблиц и дизайнер, в свою очередь, получает полный контроль над разметкой.

Url Routing (SEO улучшения)
Разработанная библиотека System.Web.Routing для ASP.NET MVC Framework оказалось настолько гибкой, что её решили использовать и в обычном ASP.NET. С помощью этой библиотеки можно будет строить "красивые" URL'ы, что несомненно хорошо для Search Engine Optimization (SEO).

Другие SEO улучшения
В класс Page добавлены свойства Description, Keywords. Также добавлен новый тип редиректа Response.RedirectPermanent(new url), который использует статус-код 301 (moved permanently).

QueryExtender Control
Добавлен новый контрол который работает с интерфейсом IQueryable и позволяет фильтровать данные. Может легко использоваться для создания страниц поиска.

PS: Всё выше описанное српаведливо на текущий момен, но к релизу что-то может поменяться

апр 13

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

ISAPI-расширения

Разные типы запросов (имеются ввиду расширения, например, .html, .aspx) IIS (Internet Information Services) сервер обрабатывает по разному. Например, расширения .html IIS сервер может обработать сам. Для обработки таких расширений как .aspx, .asmx, .ashx используется специальный компонент ISAPI-расширение (Internet Server Application Programming Interface), в данном случае aspnet_isapi.dll, которое используется как в IIS5 так и IIS6. Связать новый тип расширения файла с модулем ISAPI можно в настройках IIS.

От IIS до ASP.NET

Процесс обработки клиентского запроса на сервере начинается с драйвера Http.sys, который прослушывает входящие HTTP-запросы. Для наглядности схема обработки запроса показана на следующем рисунке.


IIS5
В данной версии IIS сервера все расширения выполняются в рамках процесса inetinfo.exe. Для взаимодействия с расширениями используются именованые каналы (named pipes), что, сообственно, не повышает производительности. В связи с тем, что при обработке запроса приходится пересекать границы нескольких процессов, создаются дополнительные накладные расходы. Да и загрузка в контекст процесса inetinfo.exe всех расширений может привести к сбою сервера в случае выхода из строя одного из них.

IIS6
Начиная с Windows 2003 драйвер драйвера Http.sys был интегрирован на уровне ядра Windows. В Windows 2003 также был добавлен Web Administration Service (WAS), который проверяет расширения запросов. Если запрос предназначается ASP.NET-приложению (.aspx, .asmx, .ashx-расширения), WAS создает рабочий процес w3wp.exe и передает в него запрос, в ином случае запрос передаётся в IIS. Благодаря этому обработка запроса происходит быстрее, потому что нет лишних обращений через границы процессов.

После создания рабочего процесса в него загружается среда выполнения .NET, именно рабочий процесс является хостом CLR. После того, как CLR была запущена и сконфигурирована нужным образом, происходит вызов метода ISAPIRuntime.ProcessRequest, который можно сказать и является точкой входа в ASP.NET. Данный метод создает обьект класса HttpWorkerRequest, который потом передаётся в статический метод HttpRuntime.ProcessRequest.
На данный момент существуют три класса, реализующие HttpWorkerRequest.

Класс Описание
ISAPIWorkerRequestOutOfProc ASP.NET работает с IIS 5.0
ISAPIWorkerRequestInProcForIIS6 ASP.NET работает через IIS 6.0 (под Windows 2003)
ISAPIWorkerRequestInProc
ASP.NET работает без IIS 6.0 (под Windows 2003)

Ну а далее класс HttpRuntime создаёт обьект HttpContext. HttpContext в свою очередь, создаёт HttpRequest, HttpResponse. После этого через фабрику HttpApplicationFactory создается новый экземпляр HttpApplication. В него загружается его состояние, то есть объект класса HttpApplicationState. Далее выполняется инициализация HttpApplication.


Затем запросы пересылаюся на HTTP-модули, которые могут выполнить предварительную обработку перед запуском обработчика. После выполнения обработчика запрос снова пересылается на модули, которые могут выполнить заключительную обработку.
После того, как запрос был полностью обработан, экземпляр HttpApplication может быть помещён в пул, если на момент помещения размер пула не превысил 100 экземпляров (интересно почему данное число прописано хардкодом в классе HttpApplicationFactory?!), иначе все ресурсы, используемые этим обьектом, освобождаются, в том числе и Http-модули. У каждого из них вызывается метод Dispose.

Модули HTTP

Одним из средств расширения, которое предоставляет ASP.NET, являются HTTP-модули. С помощью HTTP-модулей можно подписаться на события, которые генерит класс HttpApplication и таким образом управлять обработкой HTTP-запросов. Для реализации сообственного HTTP-модуля нужно реализовать интерфейс

public interface IHttpModule

{
    void Dispose();
    void Init(HttpApplication context);
}
В методе Init можно подписаться на события, которые генерирует класс HttpApplication.

Событие
Описание
BeginRequest Вызывается при поступлении нового запроса
AuthenticateRequest Запрос готов для выполнения аутентификации
PostAuthenticateRequest Вызывается после того, как модуль безопасности установил личность пользователя.
AuthorizeRequest Запрос готов для выполнения авторизации
PostAuthorizeRequest Вызывается после того, как был авторизирован пользователь для текущего запроса
ResolveRequestCache Вызывается после события авторизации, чтобы модули кэширования обрабатывали запрос из кэша
PostResolveRequestCache Происходит, когда ASP.NET обходит выполнение текущего обработчика событий и позволяет модулю кэширования обработать запрос из кэша
PostMapRequestHandler Вызывается после того, как ASP.NET связало текущий запрос подходящим HttpHandler'ом
AcquireRequestState Используется для восстановления текущего состояния (например, состояние сессии) для текущего запроса. (После этого события становится доступной сессия)
PostAcquireRequestState Происходит, когда состояние запроса (например, состояние сессии), было получено
PreRequestHandlerExecute Вызывается перед тем, как запрос начнёт обрабытывать HttpHandler.
PostRequestHandlerExecute Вызывается после того, как запрос обработал HttpHandler.
ReleaseRequestState Вызывается после того, как ASP.NET закочило обработку запроса. Оповещает модули состояния о необходимости сохранить данные состояния запроса.
PostReleaseRequestState Происходит, когда ASP.NET закончило выполнение всех обработчиков событий данные состояния запроса были сохранены
UpdateRequestCache Сообщает, что вся обработка запроса завершена и ответ сервера может быть закэширован.
PostUpdateRequestCache Вызывается, когда ответ сервера был закэширован.
EndRequest Последнее событие из цепочки, которое сигнализирует о завершении обработки запроса.

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

Событие
Описание
PreSendRequestHeaders Вызывается перед отправкой Http-заголовков клиенту
PreSendRequestContent Вызывается перед отправкой содержимого ответа сервера коиента
Error
Сигнализирует о необработанном исключении

Чтобы HttpApplication знал о существовании модуля, его необходимо зарегистрировать в web.config.

Пример регистрации HTTP-модуля:

<httpModules>
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions"/>
 </httpModules>

Обработчики HTTP

Другим средством расширения ASP.NET являются HTTP-обработчики (HttpHandler), которые обрабатывают определённый тип запросов. Чтобы создать свой обработчик нужно реализовать интерфейс
public interface IHttpHandler
{
     bool IsReusable { get; }
     void ProcessRequest(HttpContext context);
}
Метод ProcessRequest выполняет непосредственную обработку запроса, а свойсто IsReusable указывает на то, может ли экземпляр даного класса использоваться повторно для других запросов. При IsReusable=false каждый раз будет создаваться новый экземпляр. Как и в случае с HTTP-модулями, HTTP-обработчики нужно зарегистрировать в конфигурационном файле. Пример:
<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="GET,HEAD" path="ScriptResource.axd"
type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions"
validate="false"/>
</httpHandlers>
Параметр path задает маску ресурсов, запросы к которым будут обрабатываться данным обработчиком. Verb задает типы HTTP-запросов, которые будут перенаправляться обработчику, например, "GET", "POST", "*" (включает любые типы запросов). Атрибут type указывает имя класса обработчика.
В корневом файле web.config (%SystemRoot%\Microsoft.NET\Framework\v%CLRVersion%\CONFIG) определены основные HTTP-обработчики:
<httpHandlers>
    <add verb="*" path="*.rules" type="System.Web.HttpForbiddenHandler" validate="true"/>
    <add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True"/>
    <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True"/>
    <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True"/>
    <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True"/>
    <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
    <add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
    <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
    ....
</httpHandlers>

Примечание

Связывая новый тип расширения файла с HTTP-обработчиком, нужно ещё связать это расширение в IIS с модулем aspnet_isapi, для того чтобы запрос не блокировался на уровне сервера, а перенаправлялся ASP.NET.

Ссылки по теме:

http://www.rsdn.ru/article/dotnet/insideaspnet.xml - когда этот пост был уже на половину готов, я обнаружил вот эту статью на RSDN. Поэтому, если интересно более детальное описания взаимодействия IIS и ASP.NET, рекомендую к прочтению.
http://www.15seconds.com/Issue/020417.htm
http://www.theserverside.net/tt/articles/showarticle.tss?id=IIS_ASP
http://www.programmersheaven.com/2/a-low-level-look-at-the-asp-page-2     
дек 28
Пост личный, поэтому к IT-сфере он имеет слишком малое отношение.

2008 год Сегодня 28 декабря, а это значит, что до нового года осталось всего 3 дня :). Думаю, как раз пришло время подвести итоги по уходящему году. И так чем же запомнился 2008?! Далее обо всём в хронологическом порядке.

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

Карпаты
7-10 мая вместе с коллегами по работе провёл в Карпатах. Отдых на природе, красивые пейзажи, вино останутся в памяти надолго. Ещё бы, это был первый раз за 8 лет знакомства с моей девушкой (с которых большую поливину мы провели вместе), когда её родители официально разрешили отдохнуть вместе.

Университет
Начиная с 2003 по 2008 я провёл в стенах Житомирского государственного технологического университета. Не могу сказать, что это были мои лучшие года. Вообще, об этом  я буду судить лет в 60, когда состарюсь. А пока университет закончился, группа разбежалась по разным сторонам и времени, чтобы кого-то увидеть, совсем не хватает. Кому интересно, то университет я окончил с красным дипломом. Хотел повесить его где-то на стенку в рамочке, но руки никах не доходят.

Машина
Наверное, одним из самых ярких событий 2008 года было приобретение сообственной машины. Хотя у меня и до того была "девятка" (ВАЗ 2109), которую мне подарил отец двумя годами ранее, с новой машиной (Skoda Octavia Tour), купленной в кредит на свои деньги, она не сравнится. Это была моя детская мечта... Самое, что не есть приятное осознавать, что сбылась она благодаря сообственным стараниям. Такой вот "небольшой" подарок сделал себе на 22 день рождение.

Отдых
Помнится раньше, когда ходил в школу, родители регулярно отправляли на море, иногда даже получалось два раза за лето погреться на солнышке. Но с поступлением в университет жизнь кардинально изменилась. Отдыхать было некогда. Лето - это самое хорошое время, чтобы заработать немного денег на одежду, на пиво по вечерам с друзьями, на букет цветов любимой девушке. Вот так и прошли 5 лет в университете и в итоге море я видел только по телевизору.
К счастью, в этом году я уже мог себе позволить нормально отдохнуть две недели в Евпатории.

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

MCP
В начале осени решил осуществить ещё одну мою давнюю мечту, то есть сдать МСР-экзамен 70-528 Microsoft .NET Framework 2.0 – Web Based Client Development. Как оказалось потом планы на этот год были перевыполнены после сдачи второго МСР 70-536 Microsoft .NET Framework - Application Development Foundation и получения статуса Microsoft Certified Technology Specialist.

Работа
Вот уже почти как два с половиной года я работаю в украинском подразделении (ISM Ukraine) голландской компании ISM. За всё это время я сменил не так уж много проектов, но все они были по своему интересны. Последний из них, разрабатываемый и в данный момент, приносит огромное удовольствие. Это, наверное, одна из главных мотиваций для творческих людей, к которым я отношу и себя. Плюс ещё и комманда собралась отличнейшая, с которой и в баню сходить  - не вопрос и друг друга поддержать в трудную минуту - не проблема.

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

Вот, впринципе, и всё, чем запомнился уходящий 2008. Ну и напоследок планы на будущее.

Планы на 2009
Во первых, хотелось бы найти больше времени для блогописательства, да и для блогочитательства тоже. Уже и не вспомню, когда последний раз открывал RSS-ридер.
Во-вторых, после того, как посмотрю, насколько повлияли МСР-экзамены на рост зарплаты, может быть подготовлюсь ещё к парочке.
В-третьих, в очередной раз понимаю, что нужно подтягивать английский. Одно дело, когда ты понимаешь, другое - когда без проблем понимают тебя.
В-четвёртых, хочу поехать за границу. Неважно куда, толи летом в Турцию, то ли по работе в Голландию, просто хочется посмотреть мир.
В-пятых, пора уже думать о семье и может быть о переезде в столицу и смене работы. Время покажет.

Вот такие вот планы на 2009. Осуществлятся они или нет, напишу ровно через год. 
дек 17

Подборка анекдотов по теме

Собрались Буш, Медведев и Ющенко обсудить, кто как спасает свою страну от финансового кризиса:
Буш: Мы приняли стабилизационную программу на 700 миллиардов долларов, снизили ставку рефинансирования, и пообещали народу, что снизим налоги.
Медведев: Мы повысили цены на нефть и на газ, выслали ФСБ выбить дополнительные бабки с олигархов, и объяснили народу, что Запад загнивает, а Россия поднимается с колен.
Ющенко: А я объявил новые выборы, и наш народ финансовый кризис уже не гребет!

"Я плачу и плачу"... Поставьте правильно все ударения в этой фразе, и вы
сами поймете степень своей кредитоспособности.

Как поступает премьер-министр, если за два дня курс национальной валюты обваливается на 25 %, инфляция за год составляет 20%, производство падает на 4%, половина металлургических комбинатов остановлена,  5 системных банков на грани банкротства?
В Голландии - сдает в бюджет все семейные ценности и ездит на велосипеде.
В Англии - уходит в отставку и пишет покаянные мемуары.
В Японии - совершает харакири.
В Украине - выигрывает парламентские и президентские выборы...

Главу Нацбанка спрашивают:
-Вы будете поддерживать курс падающей гривны?
-А зачем? Гривны - это красивые деньги и красота их главное предназначение.

6:30 утра.
Встречаются два дворника.
Один на другого долго так смотрит и вдруг говорит:
- У вас такое лицо знакомое...
а второй в ответ:
- ...А вы в каком банке работали?

В период кризиса звонит один банкир другому:
- Ну, как ты там? Как спишь?
- Да ничего... Сплю, как ребенок...
- Это как?
- Сегодня всю ночь плакал и два раза обгадился.

А вот и мой любимый, который рассказал мне шеф-"юморист":
Сын спрашивает отца:
- Папа, а нас каснется финансовый кризис?
- Сынок, он только олигархов каснется , а нам пиздец

дек 07

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

Сегодня чисто случайно наткнулся вот на такую разработку yetanotherforum.net .  Тестовый вариант можно посмотреть здесь.

YetAnotherForum.NET (YAF) - это open source форум, предоставляемый под лицензией GPL, более детально на сайте разработчиков.

Размер архива с исходниками 1,58.