Как мы знаем, микрософт предлагает невероятные возможности по распространению контента во все точки мира, что заметно уменьшает время доступа к контенту. Это CDN. Как я писал ранее это сокращает трафик между континентами (бэкбонами). Но, чтобы включить CDN у простого сайта есть несколько особенностей, о которых напишу под катом, так как не достаточно просто включить CDN в панели управления и настроить CNAME домена.
[Далее]
Метки: Code | microsoft
- Автор flashr апреля 30, 2012
Микрософт создало плагин для Visial Studio с
системой ачивментов. Написал прогу - 1 очко, написал работающую прогу - 2 очка, написал прогу работающую на новых технологиях - 5 очков . С первой компиляцией получилось
67 поинтов.
[Далее]
Метки: Code
- Автор flashr марта 12, 2012
При использовании XML сериализации удобно, чтобы в результат не попадали поля, которые содержат нулевые значения. Для стринговых и объектных полей все просто, достаточно в классе создать свойство, которое на get делает проверку значения объекта и если не нужно включать его в XML, то возвращаем null. В случае простого поля типа INT ( decimal) не удобно переходить от простого int к System.Nulable (int?). Но на помощь приходит весьма интересный патерн, о котором вероятно многие и не знали. Достаточно завести в классе свойство public bool ShouldSerialize{FieldName}() {return {FieldName}.HasValue;} , которое указывает, нужно ли сериализовать переменную {FieldName} или нет.
Метки: Code
- Автор flashr февраля 18, 2012
Презентация
о нововведениях в asp4.5 и msvs2011 с последней конференции в Нидерландах.
[Далее]
Метки: Code
- Автор flashr ноября 2, 2011
На хабре наблюдается изменение в политике отображения вставок, поэтому изменил
сервис подсветки кода, чтобы вырезались все пустые строчки при использовании HTML вывода. Получается компактно:
Copy Source | Copy HTML
public class Application
{
public Guid Id { get; set; }
public String Name { get; set; }
public Version CurrentVersion { get; set; }
public String RootFolderPath { get; set; }
public List<Update> Updates { get; set; }
}
public class Update
{
public String UpdateUrl { get; set; }
public Version Version { get; set; }
public bool IsInstalled { get; set; }
public bool IsDownloaded { get; set; }
public string UpdateLocalPath { get; set; }
}
Напомню, что также непозволительно вставлять код вида ">0", который также автоматически заменяется на "> 0"
[Далее]
Метки: bugs | Code
- Автор flashr сентября 26, 2011
Уже много хорошего было сказано про следующую версию asp.net , которая выйдет вместе с windows server 8.
Для тех кто пропустил. Вот видео про минимизацию
и заметное ускорение открытия страниц. И вот еще общая
концепция улучшений. Можно видеть, что большой упор сделан на асинхронные операции. В частности по получению ответов из WebResponse. Сейчас же приходится использовать много второстепенного кода для реализации асинхронного сичтывания. Ниже приведу фрагмент, который используется для асинхронной обработки ответов получаемых из ЖЖ. После нескольких ДДОС атак они стали параноидальными и включили в ответах chuncked, чтобы контролировать загруженность канала, поэтому синхронное считывание очень часто проваливается. Выход из этой проблемы реализуется следующим классом, который надеюсь станет неактуальным в 4.5:
код под катом
[Далее]
Метки: Code
- Автор flashr сентября 12, 2011
Некоторые особенности с организацией вызова PowerShell на WindowsServer 2008R2, для выполнения произвольного скрипта
1) Ставим PowerShell, через стандартную установку Features для WindowsServer, далее пишем примерно такую функцию
2) Важно, что ей можно передовать разовые команды, а можно имя файла, который нужно исполнить, для этого useScript ставим в true.
3) Вторая особенность неочевидна, так как PS выполняется в отдельном потоке под .Net 2.0 , а у вас .Net 4.0, то все токены прав потеряются, во избежание этого вы в приведенной выше функции указываем исполнять PS в том же потоке, что и текущий код (runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;).
4) Следующей командой важно разрешить выполнение скриптов в отдельном файле. Так как по умолчанию это запрещено (scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");).
5) И в завершение важно помнить, что PS выполняется с рабочей директорией System, которая отлична от вашей текущей, поэтому все относительные пути в файле скрипта могут не работать.
[Далее]
Метки: Code | microsoft
- Автор flashr августа 31, 2011
О проблеме DNS для Азура
уже упоминалось, но оказалось все сложнее. Российский регистратор webnames не смог выставить DNS для доменов на нужные, ссылаясь на ошибки в SOA записях, даже техподдержка пока не помогла. Так что домены по 90р за штуку до добра не доведут. Поэтому я озадачисла поднятием и настройкой своего пула DNS серверов и видимо с этим столкнется любой вебмастер, который захочет работать с Азуром без использования дорогово CDN.
Алгоритм выглядит просто.
1) Заказываем на той же Агаве пару серверов IIS Web за 500р в месяц, включаем на каждом из них DNS Server, на втором настраиваем репликацию первого.Заводим нужные Зоны. Записи A и CNAME на www. Также настраиваем SOA чтобы TTL был секунд 20, а не час.
2) На primary DNS сервере ставим PowerShell из стандартного пакета, там в разделе Features есть. И пишем win-service который бы раз в 5 минут опрашивал ваши азурные сайты на предмет не изменился ли у них IP адрес. Если изменился, то выполняем PS скрипт, чтобы поделиться которыми и написан данный пост.
3) Первое, это когда служба только запускается и ей нужно определить список всех доменных зон на сервере, делается это так:
Copy Source | Copy HTML- Get-WmiObject -ComputerName localhost -Namespace 'root\MicrosoftDNS' -Class MicrosoftDNS_AType |Sort-Object -unique containername|Select containername,ipaddress
4) И второе, это когда обнаружены домены, для которых нужно поменять А записи, вызывается
такой вот скрипт. Вызов выглядит как "./update-DNSAddress -forward localhost -reverse localhost". А в файле dnsaddresslist.csv со списком нужных изменений присутствует шапка "Name,Address" и далее по домену-айпи на каждой строчке разделенных запятой.
Это базовые знания, чтобы решить проблемы динамических адресов в Azure, но при желании могу добавить ваш домен на свои обновляемые DNS server'a.
[Далее]
Метки: Code | microsoft
- Автор flashr июня 28, 2011

В Индусском Windows Azure есть много проблем. И одна из первых, с которой вы столкнетесь - невозможность отправить простое письмо во вне. Да это логичное ограничение настройками безопасности фаервола на всех системах, но так как это не одна машина, а облако - у вас нет возможности ее обойти. Даже через поиск
находятся дурацкие решения, в которых предлагается либо 1) купить сторонний релай во вне и отправлять почту через него 2) стать подписчиком Exchange сервисов микрософта.
Но на самом деле, есть возможность отправки почты через Гугл, работающий через SSL и на неблокированном 587 порту. То есть делаем,
Copy Source | Copy HTML- var client = new SmtpClient(props["SmtpServer"])
- {
- DeliveryMethod = SmtpDeliveryMethod.Network,
- Credentials = new NetworkCredential(props["SmtpLogin"], props["SmtpPwd"]),
- Port = int.Parse(props["SmtpPort"]),
- EnableSsl = true,
- };
-
- what = what + @"
С Уважением, Почтовая служба " + props["HostAddress"];
-
- try
- {
- #if !DEBUG
- client.Send(props["SmtpLogin"],
- to,
- "Subj",
- string.Format(what, pars));
- #endif
- }
- catch (SmtpFailedRecipientsException)
- {
-
- }
и соответственно настройки
Copy Source | Copy HTML- <add key="SmtpServer" value="smtp.gmail.com" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
- <add key="SmtpLogin" value="mail@gmail.com" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
- <add key="SmtpPwd" value="password" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
- <add key="SmtpPort" value="587" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
Также, на всякий случай, добавляем в настройки разрешение на выполнение native кода -
PS: С июля этого года Azure вроде объявило о бесплатности всего входящего трафика. [Далее]
Метки: Code | microsoft
- Автор flashr июня 15, 2011
Ниже расскажу о реализации проброса WCF запросов от одного сервера через несколько промежуточных, так называемый wcf tunneling, вопрос о реализации которого уже поднимался на gotdotnet.ru. Там автор предлагал использовать Castle.DynamicProxy для динамической генерации прокси-классов для создания канала. Однако комментаторы отметили, что полученный функционал дублирует лишь стандартные возможности при прямом взаимодействии точка-точка.
Актуальность приобретается, когда добавляется набор промежуточных точек. При этом на клиенте идет перехват вызова произвольной удаленной функции FuncName на вызов абстрактной функции object _DataTransfer(HeaderAuthen auth, object ServiceLink, object FuncName, object[] param); Далее обращение транслируется через серию промежуточных машин и в итоге обращение передается на ServiceLink, где обрабатывается. Также возвращается результат. Грубо говоря примитивный функционал Biztalk своими руками по передачи soap сообщений в многосвязной сети. Кроме того мы без ведома пользователя накладываем на канал защиту через HeaderAuthen auth.
Отдельно выкладываю реализацию
класс DynamicServiceProxy и ServiceChannelManagerInterceptor, подменяющие вызов, а также сам вызов в
ServiceChannelManager. Соответственно все закладывается в библиотеку, которая должна быть на всех точках, а на туннельных-промежуточных точках еще и
реализуется Контранкт, в котором важно описать передаточную функцию _DataTransfer, все функции на конечных точках, а также все классы и типы через KnownTypeContainer. Также важно включить сериализатор XmlSerializerFormat, так как по умолчанию в WCF используется DataContractSerializer, которых не позволяет передавать object. То есть вызовы проходить будут, а данные - нет. Кроме того у XmlSerializerFormat тоже есть особенность, кто нельзя передать некоторые стандартные типы, например, DataSet как параметр, так как в них используется нетипизированный ArrayList. Вот пожалуй и все, что нужно знать.
[Далее]
Метки: Code | Csharp
- Автор flashr июня 1, 2011
Буквально на днях после моих постов о неудачном использовании Windows Azure появилась специальная акция для российских пользователей,
которая позволяет потестировать сервис без использования кредитной карты и как следствие без угрозы списания средств. Воспользуюсь возможностью.
А пока, выяснилось, что для юридических лиц есть возможность использовать Азуре в России, несмотря на официально НЕ предоставляемый сервис. Для этого надо заключить договор с ребятами из софтлайна - azure.softline.ru, которые мне честно и признались, что придется платить с небольшой доплатой за их посреднические услуги.
Что касается самого использования Windows Azure, то пока обнаружил около 5 скрытых камней, о которых официально не говорят, но с которыми придется сталкиваться всем. Будет время - распишу подробно.
[Далее]
Метки: Code | microsoft
- Автор flashr апреля 22, 2011
Недавно писал про оптимизацию сайта для всяких спидтестов. Но все они бесполезны, если сам сайт работает медленно, а чтобы его ускорить нужно не только встроенное кэширование на уровне страниц - @OutputCache, но и кэширование на уровне объектов модели. Кэширование на уровне базы, всякие memcache актуально лишь когда есть куча FrontEnd'ов и они тоже генерят немало запросов несмотря на свое кэширование.Так вот, для кэширования объектов в asp.net делается простой класс, например:
Далее...
Метки: Code
- Автор flashr апреля 19, 2011
В сети появился доклад Mad'a на конференции Mix11 в ЛасАнжелесе,
смотреть тут. В нем рассказывается прежде всего как с помощью настройки asp.net сайта добиться показателей на тестах скорости
YSLOW и
PageSpeed близких в 100. Как нетрудно догадаться в результате получается сайт, когда браузер вообще не делает запрос к серверу, так как всюду проставлен Expired. Единственная сложность кроме всяких сжатий, была в уменьшении числа запросов к серверу. И когда эта проблема была решена было верно замечено, что если бы использовался CDN для статики, то такой проблемы бы и не возникло.
[Далее]
Метки: Code
- Автор flashr апреля 6, 2011
Открыл для себя очень дружное сообщество эстонских
русскоязычных разработчиков. Вот парочка просто замечательных докладов, которые всем рекомендую.
WTF Code.
БОТы и Автоматизация процессов - Александр Ястремский.
[Далее]
Метки: Code
- Автор flashr февраля 9, 2011
Давно не выкладывал технических постов, а они, как показывает статистика, приносят наибольшее число просмотров через поисковики.
Поэтому сегодня опишу общно и без детальных картинок проблематику взаимодействия с документами MS Office 2007 из веб-сайта при помощи поставляемых в комплекте библиотек-прослоек Office.Interop. Эта история интересна тем, что ее решение содержит кучу проблем, но нигде я не видел целостного описания их преодоления.
Во-первых, вам понадобится установить на сервер офис. Берем пиратскую энтерпрайс. Так как некоторые версии могут отказаться ставится на сервере через терминал (RDP).
После того как в программе сделали Reference, написали нужны код, скопировали на сервер у вас появится:
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005
Решение - запускаем DCOMCNFG, выставляем пользователю NetworkServices права на запуск компонентов MicrosoftOffice(Word/Excel) или для того пользователя от лица которого работает ApplicationPool.
Запускаем повторно, вылезает
(0x800A03EC): Microsoft Office cannot open or save any more documents because there is not enough available memory or disk
Решение - Создать системные папки
C:\Windows\SysWOW64\config\systemprofile\Desktop (для x64)
C:\Windows\System32\config\systemprofile\Desktop (для x86)
и выставить права для NetworkServices на папку - systemprofile.
На этом квест не заканчивает. При повторном запуске программа выдаст
(0x80028018): Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))
http://support.microsoft.com/kb/320369
Что говорит о разнице в локализации вашего кода и компонента. Решается переключением локализации вызывающего потока перед вызовов функций COM объекта
System.Globalization.CultureInfo oldCI =
System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
//вызовы Office.Interop
Вот пожалуй все, однако, на win2003x64 IIS6 EN даже вышеописанное не помогло.
[Далее]
Метки: Code
- Автор flashr декабря 8, 2010
Последние месяцы было несколько громких событий с популярными проектами с открытым исходным кодом. Вероятно это связано с тем, что все начали подводить итоги года и остались не очень довольны:
1) Lucene.Net - в ноябре обратилась ко всему сообществу с заголовком
needs your help (or it will die) и
It got forked. Напомню, что это .Net реализация самой популярной поисковой библиотеки, которая также используется в твиттере. Суть проблемы, что Apache Software Foundation решили прибить проект, из-за того, что неактивно развивается.
2) OpenSocial - в декабре объявило, что им нужен
.Net разработчик, а также
открыто место в наблюдательном совете для всех желающих. Опять же из-за недостаточной активности сообщества.
3) GoogleWave - социальная сеть от гугла, ранее выложенная в опенсорс, не смогло собрать вокруг себя достаточного числа разработчиков, поэтому решала разместиться внутри еще живущего Apache Foundation сообщества. Теперь проект смело можно
называть Apache Wave.
В догонку - количество пользователей ICQ упало на треть, сервера этой системы скоро перевезут в Москву, так как только тут остались пользователи.
[Далее]
Метки: Analytics | Code
- Автор flashr сентября 30, 2010
Достаточно долго уже работаю в Visual Studio 2010, как уже писал - все нравится. Это нравится включает
Resharper 5 с кряком(пароль на архив - yandex, так как глючный dr.web считает его вирусом) и
список всех горячих клавиш . Пользуйтесь.
[Далее]
Метки: Code
- Автор flashr сентября 17, 2010
Всегда не любил выдачу JSON за то, что она подразумевает обработку в JS на стороне клиента, а значит много гемора для программиста. Но оказывается существует уже и полноценное решение делающее JSON не сложнее обычной XML сериализации. Речь про
newtonjson.dll, написанную на .Net и неплохо документированную. Отдельно порадовала возможность конвертации конечного листа дерева в произвольный тип путем простого вызова типа
cursor["leafname"].Value<long>();. Вот бы все значения ячеек для датагридов тоже имели такой шаблонизатор, чтобы не прописывать каждый раз приведение типа.
Пример JSON сериализатора в .Net для результатов выдаваемых гуглом при поисковых запросах через AJAX API -
можно найти в последних изменениях blogsapiPS: отдельно отмечу, что готов взять программиста на частичную занятость для поддержания моих хобби проектов и развития некоторых идей.
[Далее]
Метки: BlogsAPI | Code | Csharp
- Автор flashr сентября 2, 2010
Сегодня расскажу как реализовывается работа приложения через OAuth, если пользователь передает просто логин и пароль.Прежде всего потребуется класс OAuthUtility,
код которого есть в blogsapi. На первом этапе мы проверяем производили ли мы аутентификацию пользователя ранее. Если нет, то обращаемся к твиттеру с логином и паролем, соответствующему нашему приложению (tokens.ConsumerKey,tokens.ConsumerSecret). Получаем назад ключ(response.Token), по которому мы можем построить запрос (OAuthUtility.BuildAuthorizationUri(response.Token)) на получение уникальных логина и пароля для пользователя нашего приложения. Назад возвращается страница, на которой пользователю предлагается ввести логин и пароль, но так как мы не хотим тревожить пользователя, то вводим их за него, незабывая извлечь со страницы authenticity_token. Если логин и пароль правильны, то нам возвращается уникальный PIN, который пользователь должен потом передать нашему приложению, в качестве единоразового пароля для получения постоянного пароля. Опять же парсим страницу вручную, чтобы не тревожить пользователя. И в завершение делаем запрос OAuthUtility.GetAccessToken, чтобы по разовому паролю наше приложение получило постоянный пароль. И сохраняем результат, чтобы больше не повторять этих действий. В итоге наше приложение, чтобы сделать запрос от лица пользователя передает не логин и пароль, а аж 4 строчки, соответствующие 2м логинам и паролям от них.
Основная выгода - безопастность, и то, что эти строчки намного сложнее чем первоначальные логин и пароль пользователя, что гарантирует сложность их подбора. Но с другой стороны, они не имеют срока давности, поэтому зная их с легкостью можно выполнить действия от лица пользователя-приложения, в отличии от куков или сессий для авторизованных клиентов сайтов.И общая схема, демонстрирующая весь ужас того, во что превращается простая ранее операция по выполнению действий при помощи логина и пароля:

Код самой функции "залогинивания" в твиттер.
Далее...
Метки: BlogsAPI | Code | Twitter
- Автор flashr августа 26, 2010
Хорошая статья по новым фишкам в .Net 4 в области
синхронизации потоков.
[Далее]
Метки: Code