Prague. January 2013. Church of St. Nicholas.
Prague. January 2013. St.Vitus Cathedral.
IIS 8, HTTP OPTIONS, CORS и ASP.NET Web API
Сегодня столкнулся с интересной проблемой. На одном из web api под IIS 8 не работала поддержка CORS из nuget-пакета Thinktecture.IdentityModel.
Здесь можно посмотреть пример использования этой библиотеки, и здесь - как нужно сконфигурировать приложение для корректной работы.
Просмотр запросов с помощью fiddler дал понять, что в ответ на http запрос OPTIONS сервер отвечает простым ответом ОК без указания нужных заголовков, в частности - Access-Control-Allow-Origin.
Опытным путем обнаружилось, что если на сервере включить опцию RAMMFAR ( runAllManagedModulesForAllRequests=”true”), то delegating handler для поддержки CORS начинает работать. Однако включать эту опцию не очень хотелось, пусть даже она влияет не на все managed модули, поэтому я продолжил исследования дальше.
Выяснилось что в моем случае в IIS установлен еще один хэндлер - OPTIONSVerbHandler. Как только я его убрал в web.config, приложение стало работать нормально при выключенной опции RAMMFAR.
Вот, что в итоге получилось в web.config:
IIS 8, HTTP OPTIONS, CORS and ASP.NET Web API
Today I met the challenging problem with one of my web apis running under IIS 8. CORS support which was implemented with nuget library Thinktecture.IdentityModel didn’t work properly.
Here you can find information how to use this library, and here is the link to configuration issues with IIS.
After spending some time with a fiddler tool I found out that the client sends the proper HTTP OPTIONS request, but the response from server lacks Access-Control-Allow-Origin and other useful http headers.
After some experiments it turned out that if I enable RAMMFAR option ( runAllManagedModulesForAllRequests=”true”) in web api web.config, the CORS delegating handler starts to work. However I don’t like turning on this option, even if it doesn’t really affect all managed modules in IIS, so I kept experimenting.
I found out that there is another handler defined in IIS, called OPTIONSVerbHandler. As soon as I removed it via application web.config file, CORS support started to work properly without need to enable RAMMFAR option.
This is system.webServer section in web.config:
TypeScript - a typed JavaScript
Anders Heijlsberg introduces a new programming language: TypeScript, which is a typed superset of JavaScript. It will compile to normal javascript.
The TypeScript language specification is available under Open Web Foundation and the compiler implementation is available as Open Source.
Anders talk about TypeScript is available on Channel 9
http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript
TypeScript - типизированный JavaScript
Андерс Хайлсберг представляет новый язык программирования - TypeScript, который является типизированным надмножеством языка JavaScript, и компилируется в него.
Спецификация языка TypeScript доступна на Open Web Foundation, a компилятор выложен в Open Source
Андерс рассказывает о TypeScript на Channel 9:
http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript
Resolving VPN problems on Windows 8
After installing Windows 8 as my primary OS I met one very tricky problem with VPN. I couldn’t connect to one of my VPN networks, and the same VPN connection on Windows 7 worked just fine.
The solution was to set the following security parameters in VPN connection’s properties:

Проблема с VPN в Windows 8
После перехода на Windows 8 в качестве основной рабочей системы на десктопе я долго не мог решить проблему с VPN. Одно из подключений отказывалось работать, при этом подключение с такими же параметрами на Windows 7 отлично работало.
Решение оказалось простым - нужно было выставить в свойствай VPN-подключения следующие параметры безопасности:

How To Upgrade To Windows 8 RTM From Release Preview
It was actually very easy to upgrade to windows 8 RTM.
You just mount the .iso file, then run the installer. Choose “keep my files”, type in your product key, and then you’re all set. After the installation process completes, you will have new OS installed. The files in your user directory under My Documents, etc, will be migrated. Your old system directories will be moved to windows.old folder.
If you want to delete the old files, you can use disk cleanup. Right click on your disk, choose properties, then disk cleanup, then clean up system files. Then choose old windows files, and proceed with removing them.
Unfortunately, you will have to reinstall your programs after.
Как обновить windows 8 release preview до RTM
Это оказалось очень просто сделать. Нужно просто смонтировать .iso файл c образом windows 8 RTM, и запустить установку. Дальше нужно выбрать опцию “сохранить мои файлы”, и ввести продуктовый ключ. После чего процесс установки все сделает сам.
Файлы в таких директориях как My Documents будут скопированы в новый профиль пользователя. Файлы в других директориях останутся на своих местах. Файлы в старых системных директориях будут перемещены в директорию windows.old.
Чтобы ее удалить, можно воспользоваться мастером очистки дисков. Нужно выбрать системный диск, нажать правой кнопкой и выбрать disk cleanup, затем clean up system files. После чего надо отметить пункт windows old files, и начать процесс очистки диска.
К сожалению, установленые программы не мигрируются, и их надо будет переустановить заново.
Видео моего доклада про асинхронное программирование в ASP.NET
Видео доступно на сайте techdays.ru. Презентация и примеры кода лежат на github. Буду рад вопросам, замечаниям, предложениям о чем рассказать в следующий раз.
Writing Unit Tests For ASP.NET Web API RC
After I moved one of my solutions to ASP.NET Web API RC I found almost every test broken. A quick investigation shown, that I get null reference exceptions, because of new HttpResponseMessage creation paradigm in ASP.NET Web API RC. Instead of creating new HttpResponseMessage instance, I now have to call Request.CreateResponse() method, and obviously I had null Request in my test environment.
So, I instantiated a new HttpRequestMessage instance and added it to the Request property of the controller being tested. But this was not enough to fix things, and the next problem wasn’t that obvious and took time for me to find out the solution.
The next problem was that newly created request message lacked an instajce of HttpConfiguration attached to it. And to attach this configuration to the request message, one have to set this instance into HttpRequestMessage.Properties dictionary by the special key. So, the following is the final code which fixed my tests:
Как писать тесты для ASP.NET Web API RC
После миграции на APS.NET Web API RC в одном из моих приложений у меня сломались все тесты. Довольно быстро удалось выяснить, что причина - NullReferenceException, который возникает по причине изменения способа конструирования HttpResponseMessage в ASP.NET Web API RC. Вместо того, чтобы создавать новый экземпляр HttpResponseMessage, теперь надо вызывать метод Request.CreateResponse(), а в тестовом окружении, естественно, свойство Request у контроллера было null.
Чтобы это исправить, я создал экземпляр HttpRequestMessage, и назначил его свойству Request тестируемого контроллера. Но этого оказалось недостаточно, и вот дальше найти, что происходит и как все починить, было не совсем просто :)
Следующая проблема заключалась в том, что экземпляр HttpRequestMessage должен содержать в себе экземпляр HttpConfiguration, и чтобы его прикрепить, нужно было его назначить по хитрому ключу в словарь свойств HttpRequestMessage.Properties. Ниже пример кода, который у меня работает:
Мой доклад на DevCon про асинхронное программирование в ASP.NET MVC
По следам девкона, меня просто поразило количество пришедших на мой доклад людей. Это было очень приятно, и огромное спасибо, что вы пришли! Надеюсь доклад поможет в освоении асинхронного кода и подготовке к выходу ASP.NET MVC 4 и C# 5.
Пока запись доклада не выложили, но примеры кода и презентацию я уже выложил на GitHub здесь: http://bit.ly/Kq6hOB
Буду рад вопросам, и вообще любому общению. Общаться очень удобно в twitter https://twitter.com/#!/eugene_agafonov , или можно написать сюда в комментарии.
После конференции обнаружил, что в машине сдох аккумулятор. Огромное спасибо всем, кто остановился помочь, поделился проводами, пытался подзарядить меня, и вообще помогал меня спасти. Но отдельное спасибо Володе Гусарову, который просто как добрый волшебник нашел нужный инструмент, снял аккумулятор, что на моем пыже не так то и просто, довез меня до ближайшего магазина автозапчастей, и приладил новый аккумулятор на место :)
В общем, было весело, и, надеюсь, еще увидимся! Кстати, если есть пожелания, какой доклад хотелось бы услышать - буду рад их узнать.
Доклад на DevCon12 про асинхронность и ASP.NET (WEB403) MVC
23 мая в 18:30 я буду рассказывать про асинхронное программирование в ASP.NET MVC. Код сессии - WEB403. Это уже третий девкон, на котором я выступаю, но все равно чем ближе, тем больше волнуюсь.
В докладе я буду рассказывать про то, как правильно писать асинхронный код, почему 90% примеров в интернете не совсем правильные, про то, как подготовить свое приложение к выходу C# 5 и новой Visual Studio. Покажу забавный фокус с LINQ query comprehensions :) Ну и вообще, надеюсь внести ясность, как это все работает, причем рассказывать планирую на достаточно простом уровне.
Приходите на доклад, или смотрите его онлайн на сайте конференции.
Если кому-то интересен конкретный вопрос - пишите, я вполне могу еще что-то добавить в доклад!
Отдельная просьба - поставить оценку докладу. Оценки определяют, будут меня дальше звать выступать на конференциях, или нет. И если вам захочется еще услышать мой доклад - не стесняйтесь :) Если захотите, чтобы меня больше никогда не звали - тоже пишите :)
