1. Что такое Cassini
Кассини — это простой и «легковесный» веб сервер для MS Windows, который, как несложно догадаться, обрабатывает запросы к статическим страницам HTML и приложениям ASP.NET. На момент написания статьи Кассини распространяется в составе Visual Studio и Microsoft не поощряет (но и не запрещает) его использование и распространение вне Visual Studio. Microsoft не осуществляет техническую поддержку Кассини вне Visual Studio. Тем не менее, известны случаи, когда Microsoft включала Кассини в комплект поставки своих продуктов, например, ранние версии Microsoft CRM (ныне известный на рынке как Microsoft Dynamics CRM). В марте 2006 года Microsoft открыла исходный код Кассини 2.1 по довольно либеральной лицензии, которая говорит, что код может быть использован «for any commercial or noncommercial purpose, including distributing derivative works».
На момент написания статьи мне удалось найти несколько альтернативных дистрибутивов Кассини:
- UtilDev Cassini Web Server (http://utildev.com)
- CassiniDev (http://cassinidev.codeplex.com)
Кроме того, в сети можно найти информацию об успешном декомпилировании (и последующей успешной сборке для 32-bit and 64-bit платформ) версии Кассини, распространияемой с Visual Studio.
Вот основные отличия Кассини от IIS:
- Хостинг лишь одного ASP.NET приложения на порт
- Нет поддержки HTTPS
- Не поддерживает аутентификацию
- Отвечает на запросы лишь с локальной машины
В процессе работы над одним из проектов я рассматривал вариант с использованием Кассини в демонстрационных веб-приложениях. В сем документе делается попытка обобщения разнообразной информации о Кассини, найденной в Сети, и личного опыта.
2. Зачем Cassini? Почему Cassini?
Проект, над которым мы работали, подразумевал установку веб-приложений и веб-сервисов на сервере пользователя. К сожалению, гарантировать наличие IIS на сервере не удавалось (пользователи бывают такие разные), поэтому пришлось обратить свой взор на Кассини. Ограничения, перечисленные выше, нас не смущали — речь шла лишь о демонстрационных приложениях. Программа установки нашего продукта должна была установить Кассини и веб-приложения на машину пользователя так, чтобы сразу после установки пользователь мог попробовать продукт в деле, зайдя на localhost/SomeDemoApplication.
Забегая вперед, скажу, что все получилось. Но на дороге попалось некоторое количество граблей, о которых хочется рассказать.
3. Запускаем Cassisni
Я использовал исполняемые модули Кассини из комплекта Visual Studio 2010 and built with .NET 4.0:
- WebDev.WebHost40.dll — дополнительная assembly, должна быть установлена в GAC (см. пункт «Проблемы» ниже)
- WebDev.WebServer40.exe — собственно исполняемый модуль веб-сервера, обычное Windows-приложение
- WebDev.WebServer40 config and manifest files
Запустить Кассини оказалось просто:
WebDev.WebServer40.exe /port:8111 /path:"c:\Projects\My Web Application"
и все работает: адрес localhost:8111/Home.aspx показывает мне домашнюю страничку моего веб-приложения.
Затем я включил исполняемые модули Кассини в программу установки нашего продукта с установкой WebDev.WebHost40.dll в GAC. Единственная проблема, которую осталось решить, это запуск Кассини перед тем, как пользователь идет на страничку демо-приложения. Родился вот такой скрипт, который использует простую утилитку PortQry для определения активности Кассини на порту 8111:
portqry.exe -n localhost -e 8111
if ERRORLEVEL=1 goto nolisten
echo Cassini is already running
goto end
:nolisten
start WebDev.WebServer40.exe /port:8111 /path:"c:\Projects\My Web Application"
:end
start localhost:8111/Home.aspx
Осталось лишь добавить скрипт в программу установки и ярлык для этого скрипта в меню Старт, и сетап готов.
4. Проблемы
Как всегда, не обошлось без вопросов.
WebDev.WebHost40.dll в GAC
Собственно, большой проблемы в этом нет, но вопрос остался: а почему вообще эта assembly должна быть в GAC? Я не смотрел в исходники Кассини, поэтому истинной причины я не знаю. Если это всего лишь дешевый способ получить full-trust, то следующий вопрос будет: а зачем вообще full-trust игрушечному веб-серверу? В общем, я буду чувствовать себя более уверенно, используя Кассини в своих продуктах, если кто-нибудь мне внятно объяснит, зачем WebDev.WebHost40.dll в GAC.
Поддержка 64-bit
На момент написания статьи Visual Studio и Кассини — 32-битные приложения. Если вы попытаетесь хостить 64-битное ASP.NET приложение с помощью Кассини, то будет выброшено исключение. Вам остается два варианта действий: либо перекомпилировать ваше ASP.NET приложение в 32 бита, либо попытаться воспользоваться альтернативными дистрибутивами Кассини, поддерживающими 64 бита (см. список выше).
Проблема с virtual path
У Кассини из поставки Visual Studio есть удобная опция /vpath, которая позволяет указать виртуальную папку (virtual folder) для вашего приложения. Но когда я попробовал исползовать эту опцию при старте Кассини и запустиь мое приложение из localhost:8111/MyAppVirtualFolder/Home.aspx то получил ошибку: WebConfigurationManager.OpenWebConfiguration() throwing «Failed to map the path '/'» exception. Единственное решение, которое я нашел, был запуск Кассини с опцией /vpath в привилегированном режиме (elevated privileges), тогда виртуальный путь заработал. Такой вариант годится для тестирования, но вряд ли пригоден для коммерческого продукта. Как и в случае с GAC, было бы интересно получить объяснение такому странному поведению.
5. Рекомендации
Есть случаи, когда Кассини может быть чрезвычайно полезным, но пользоваться им следует с осторожностью. Тестируйте конечное решение в возможно большем числе конфигураций и ни на секунду не забывайте о том, что Кассини не является полноценным коммерческим продуктом. Удачи!