Убиваем сайт ASP.NET правильно

Должно быть уже ни для кого не секрет, что положив в корень сайта, на ASP.NET 2.0 и выше, файл app_offline.htm – IIS будет игнорировать обращения к этому сайту, вплоть до запроса картинок, т.к. управление пулу сайта не передается и, в идеале, он попросту падает

Но все ли знают, что IIS отдает содержимое файла app_offline.htm?

Эту возможность достаточно удобно использовать во время продолжительного обновления сайта, например более 30 секунд

Но стоит помнить один важный момент – все браузеры, кроме FireFox проигнорируют содержимое этого файла, и отдадут пустую страницу (chrome, opera) или выдадут сообщение, о невозможности обработки содержимого файла (ie), если файл app_offline.htm имеет размер менее 512 байт, забавно, не так ли?

можете скачать тестовый  app_offline.htm

Записать в файл из командной строки

довольно просто, вот семантика:
<command> >> <file path>
примеры:
echo “hello” >> c:\temp\test.txt
dir c:\inetpub\wwwroot\ >> c:\temp\mysites.txt
Если файл не существует – он создается
Если файл существует – в него данные добавляются, избежать этого можно используя ">", вместо ">>", или удалив файл

Назначение нескольких адресов для одного сайта

Тема, конечно боянистая, но возникает и хочу показать, как сопоставить “нормальное” название сайта для приложения, поднятого в IIS (в частности IIS7), для работы локально Улыбка

1. Назначение адреса

Надеюсь у вас Windows Server, т.к. в IIS 7 достаточно просто создать несколько сайтов

  • запускаем консоль IIS
  • создаем новый сайт, например mybugtracker.ru
  • вводим название сайта (у меня mybugtracker.ru)
  • выбираем месторасположение сайта на носителе
  • и вводим параметр Host name, равный реальному адресу сайта в интернете
  • остальные параметры оставляем как есть, и нажимаем ОК

    image
  • Введя адрес сайта в параметр Host name значение “mybugtracker.ru” – мы сказали IIS, что запросы к нему, по адресу “http://mybugtracker.ru/” должны обрабатываться пулом сайта “mybugtracker.ru”
    Но не редкость, когда необходимо, чтобы по разным адресам – грузился один и тот же сайт. Что ж, такое возможно, и достаточно просто:

    • кликнуть по нужному сайту правой кнопкой мыши
    • выбрать Edit bindings…
      image
    • в открывшемся окне вы увидите список сопоставленных сайту адресов (по умолчанию будет один)
    • для добавления нового сопоставления – нажмите кнопку Add…
    • введите еще один адрес сайта и нажмите ОК

    image

    самое главное не забудьте – все доменные адреса должны быть направлены на ваш сервер (это уже в настройках доменного имени)

    2. Как натравить адрес на локальный сервер

    Если вам необходимо отлаживать обращение по разным адресам, к одному сайту, но при этом нет удаленной отладки, можно отредактировать файл
    c:\Windows\SYSTEM32\drivers\etc\hosts
    в этом файле можно вручную задать соответствие адреса обращения к конкретному IP адресу
    положим, я создал сайт, и хочу запустить его локально, но по адресу http://mybugtracker.ru/, для этого в файл добавляю запись:
        127.0.0.1       mybugtracker.ru
    тут говорится, что при обращении по адресу mybugtracker.ru – направить запрос на IP 127.0.0.1, а т.к. у меня стоит IIS – он его и обработает

    Не уверен в абсолютной полезности статьи, но могу сказать одно: наблюдал в прошлом году, как чуваки, для запуска одного сайта под разными доменами – создавали в IIS новый вебсайт и натравливали на одну и туже папку, в результате – память на сервере начала заканчиваться (также каждому сайту создавался 1 пулУлыбка). Представьте – более 20-ти сайтов, каждый – отжирал несколько сотен метров оперативы (кеш вроде), в то время как можно было оставить лишь 1 работающий сайт, и добавить в IIS обработку доменов-зеркал. Собственно – так ребята и сделали, с моей предпосылки, если не ошибаюсь

    WebResource.axd не найден, WebResource.axd 404

    Встречали подобное? Если да – то вам крайне повезло, т.к. не зная как решить подобную проблему – можно просидеть довольно долго (наблюдал подобное).

    Итак, 404 - WebResource.axd not found может возникать по нескольким причинам:

    1. IIS считает, что ресурс должен существовать
    Это может быть в случае, если для сайта вручную задан обработчик запросов для ASP.NET ресурсов (чем является и WebResource.axd) и установлен флаг на проверку наличия файлов.
    Для снятия флага необходимо:

  • открыть окно свойств сайта
  • перейти во вкладку “Домашний каталог” и нажать “Настройка”
  • откроется окно “Настройка приложения”, где необходимо выбрать расширение сопоставления aspnet_isapi.dll  и нажать на “Изменить”
  • в открывшемся окне снять флаг “Проверка наличия файла”
  • Untitled

    2. IIS не знает что есть такой тип
    Возможно расширение настроено нормально, но WebResource.axd по прежнему не найден, поэтому можно предположить, что добавление MIME Type может помочь

  • перейти в список MIME типов
  • нажать добавить
  • ввести расширение axd
  • ввести MIME Type application/octet-stream
  • image

    3. Вручную прописать в web.config обработчик файлов *.axd

    <system.web>
    <httpHandlers
    >
         <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="true"/>
    </
    httpHandlers
    >
    </
    system.web>
    4. Файл реально существует
    В этом случае – просто удалите файл
    5. В файле web.config запрещен доступ к этому файлу
    Удалите примерно такой код из файла конфигурации:

      <
    location path="WebResource.axd"
    >
        <
    system.web
    >
          <
    authorization
    >
            <
    deny users="*"
    />
          </
    authorization
    >
        </
    system.web
    >
      </
    location>
    В любом случае – возможны и иные причины, но описанные выше решения помогут в большинстве случаев

    Вызов методов WebService из Javascript

    Давненько читал, что можно вызывать методы вебсервиса, практически напрямую, т.е. не используя сторонние библиотеки для создания ajax запросов к вебсервису.

    Естественно я имею ввиду MS Web Services

    При обращении в веб сервису с добавлением параметра /js или /jsdebug – получаем javascript, содержащий все функции вебсервиса, реализующие обратный ajax вызов

    Для теста создал простой вебсервис, и чтобы он мог возвращать javascript отметил его атрибутом [ScriptService] 

    После этого добавил на страницу скрипт вебсервиса
    <script src="Helper.asmx/jsdebug" type="text/javascript"></script>

    Загруженный скрипт зарегистрирует в сценариях новое пространство имен под названием сборки текущего проекта

    В зарегистрированное пространство имен будет добавлена функция/объект одноименная названию класса веб сервиса, и у этого объекта есть все функции веб сервиса.

    Загруженный скрипт выглядит примерно так:

    Type.registerNamespace('SimpleCMS');

    SimpleCMS.Helper=
    function
    () {

    ...

    SimpleCMS.Helper.prototype={

    ...

    GetWhoInCart:
    function(entityIds,pageModuleIds,succeededCallback, failedCallback, userContext) {
    ...
    И как уже стало видно – у нас появилась возможность вызвать функцию сервиса из яваскрипта:
    SimpleCMS.Helper.GetWhoInCart(entityIds, pageModuleIds, function (list) { /*обработать результат*/ }
    Кстати – добавить вебсервис на страницу можно через ScriptManager:
    ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("~/Helper.asmx"));
    В разметке:
    <asp:ScriptManager runat="server">
    <Services>
          <asp:ServiceReference Path="~/Helper.asmx" />
       </Services>
    </asp:ScriptManager>
    Чем удобен данный подход? Простотой использования – достаточно вебсервис добавить на страницу, и будет нам доступ ко всем его функциям, и не нужно использовать jQuery или иные javascript фреймворки для реализации ajax-запросов



     
     

    IHttpModule для установления локализации

    Дали сайт, с кучей страниц, где каждая страница унаследована от System.Web.UI.Page, а необходимо реализовать многоязычность. Таким образом – овверайдить для каждой страницы определение локали – невозможно, а ходить по всем страницам и менять базовый класс – как-то не хотелось.
    Потому решил создать HttpModule, т.к. они вызываются для каждого запроса.

    1. создаем класс, инмплементируем интерфейсом IHttpModule, не забывая удалить эксепшн в методе Dispose()

    2. функция public void Init(HttpApplication context)вызывается при старте Application и через HttpApplication можем навесить обработчик на начало запроса от пользователя:
    context.BeginRequest += (o, e) => { наш код }

    context.BeginRequest += (o, e) =>
    {
    if (context.Context.Request["ui"] != null
    )
    LanguageUtility.SetCurrentCulture(context.Context.Request["ui"
    ]);
     
    else // выглядит не ахти, но это правильно
    LanguageUtility.SetCurrentCulture(LanguageUtility
    .CurrentCulture);
    };

    3. устанавливаем локаль:


    А в LanguageUtility уже запоминаем локаль, в моем случае – в кукисы
    Имейте ввиду – устанавливать локаль необходимо постоянно


    4. Установка культуры потока:

    Thread.CurrentThread.CurrentCulture =
                   
    CultureInfo
    .CreateSpecificCulture(culture);

    Thread.CurrentThread.CurrentUICulture =
    new CultureInfo(culture);

    5. Чтобы модуль заработал – необходимо его зарегистрировать в файле web.config:


    <system.web>
      <httpModules>
        <add name="CultureModule" type="HttpModules.CultureModule" />
      </
    httpModules>
    </system.web>


    6. собственно – установите бряки и отлаживайте


    Имейте ввиду, что подобное можно было сделать и без создания HttpModule, а всего лишь использовать событие Application_BeginRequest класса Global : System.Web.HttpApplication


    Но с другой стороны – если придется реализовывать не одну логику проверки на реквесте, а допустим несколько, и возможно – переносить логику на другое приложение, то HttpModule довольно-таки удобная вещь

    Could not load file or assembly ‘Name’ or one of its dependencies…

    Could not load file or assembly ‘Name’ or one of its dependencies. An attempt was made to load a program with an incorrect format.
    Встречали подобную ошибку?
    Если нет – считайте повезло, но вы не работаете с x64 режимом IIS
    Если Ваше web-приложение не запускается под IIS выдавая подобную ошибку – необходимо в настройках пула приложения указать 32-х битный режим работы
    Я встретился с этой ошибкой в IIS 7, потому скрины будут оттуда
    1. выбрать проблемный пул
    image
    2. кликнуть правой кнопкой мыши, в раскрывшемся пункте меню выбрать “Set Application Pool Defaults…”
    image
    3. установить значение параметра “Enable 32-Bit Applications” в True
    4. нажать Ok и все будет в порядке, если конечно, 32-х битная библиотека действительно присутствует в сборке Улыбка
    Удачи!

    Рекурсивный SQL запрос

    С помощью SQL запроса легко можно получать дочерние или родительские разделы текущего раздела.Для этого надо составить рекурсивный запрос примерно следующим образом:

    with Tree(SectionId) as
    (
    select SectionId from Sections where SectionId=@sectionId
    union all
    select s.SectionId from Sections s
    inner join Tree t on s.ParentId=t.SectionId
    )

    SELECT *
    FROM Tree

    Этот запрос вернет все ИД дочерних разделов и ИД искомого раздела.

    Internet Explorer 9

    Первые впечатления

    Понравилось:
    1. по дефолту нет менюшек, тулбарра и статусбара
    2. в девелоптулбаре появилась отдельная вкладка для написания скриптов
    3. появилась вкладка профайлинга загрузки страницы
    4. там же можно посмотреть заголовки респонса, переданные кукисы, само тело ответа с деталями, и время каждого запроса (на реквест и респонс)
    5. можон посмореть хтмл как есть, т.е. именно то что пришло с сервера и - хтмл - как его понял браузер
    6. проходит асид3 на 95!
    7. можно посмотреть список закачек (ну наконец-то)
    8. по умолчанию - при выделении текста теперь не появляется акселераторская менюшка
    9. табы можно перетаскивать из окна к окну

    Не понравилось:
    1. адресная строка расположена слева от вкладок, чтобы полностью увидеть адрес придется прокрутить в ней текст
    2. заголовок окна ие пуст, и практически бесполезен (лишь кнопы свернуть, развернуть и закрыть)
    3. остался режим совместимости, при чем он установлен по дефолту
    4. для установки постребовалась перезакгрузка :(
    5. масштабирование ужастно тупит (ctrl + mouse scrolling, тестил при 2-х открытых сайтах, при скроллинге рандомно отображался контент то одной, то другой вкладки, после закрытия одной из них - при прокрутке можно рассмотреть содержимое закрытой вкладки)

    Бесплатное и пробное ПО Microsoft®

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


    официальная страничка

    Отследить изменение данных формы

    Давненько я не писал, столько накопилось заготовок для постов, чтож... появилось время, появятся и статьи

    Работаю, значит над проектом ХХХ, сделан на ASP.NET Web Forms, и сделана там проверка на изменение данных формы, и даже работает.
    Поясняю - пользователь захотит на редактирование каких-то данных, и вдруг, без сохранения, пытается уйти со страницы, данные - естесственно не сохранятся, а может пользователь случайно закрыл окно браузера (а на форме под 50 полей) - нужно его спросить - мол, действительно хочешь уйти со страницы? И если скажет - да, то тогда позволять закрывать, если нет - то оставляем окно браузера открытым.

    На нашем проекте был использован плагин  jQuery - FormNavigate, ему отдаешь хавать форму, и он сам отследит - менялись ли данные.

    У клиента - он не работал, по крайней мере в тот момент, когда я пришел в проект - это бага имела место быть. А плагин то в IE6, IE7 и не работал

    Ну думаю, сами решим, имхо - делается просто, особенно когда лишь одна форма на странице, - вешаем обработчик нажатия клавиши на все текстовые поля (да все инпуты для данных) и если событие происходит - какой-нить глобальный флаг на странице меняем на true и все
    А при закрытии окна (обновлении, уходе со страницы) - проверяем его на true, и если он истин, то спрашиваем - а стоит ли уходить со страницы

    Для простоты - станицы где следует проверять факт изменения значений полей форм - унаследованы от интерфейса INavigateConfirm, а на мастерпейдже проверяем - если страница реализует этот интерфейс, то добавляем скрипт проверки:

    <% if (Page is INavigateConfirm)
    { %>
    <script type="text/javascript" language="javascript">
    var global_formNavigate = true; // Js Global Variable for onChange Flag

    jQuery("input[type=text], input[type='textarea'], input[type='password'], input[type='radio'], input[type='checkbox'], input[type='file']").live('change keypress', function(event) {
    global_formNavigate = false;
    });

    jQuery("input[type=submit]").click(function() { global_formNavigate = true; });

    window.onbeforeunload = function() {
    if (global_formNavigate) { }
    else {
    return "Содержимое было изменено! \n Вы уверены, что хотите покинуть страницу без сохранения?";
    }
    };
    </script>
    <% } %>

    RTFM. Книга про ИТ-аутсорсинг

    "Эта книга расскажет об основных задачах, которые вам необходимо решить для создания и развития эффективного ИТ-бизнеса. О том, как устроен этот бизнес, что нужно делать и чего не делать, чтобы у вас получилась успешная сервисная компания.
    Скачать книгу >>"

    Книга написана просто и читается на лету, рекомендую прочесть всем кто заинтересован в успешном IT бизнесе и тем, кто хочет понимать как он устроен изнутри

    Первые впечатления от ASP.NET MVC

    1. работает быстро
    2. разрабатывать дольше, чем просто на asp.net (прям закон сохранения энергии)

    Собственно - разбирался в нем я не более часа, с утра, с просони :), получилось так уж

    Базовых знаний C#, MVC как архитектуры и небольшого опыта разработки приложений на ASP.NET вполне хватает чтобы разобрать что к чему, тем более Visual Studio 2010 готова предоставить нам тестовое приложение, для разбора

    Решил посмотреть какой тестовый проект нам предоставляет студия, для разбора MVC, посмотрел и немного огорчился, т.к. студия все вьюшки, контроллеры и модели раскидывает лишь в 3 папки в корне проекта, а хочется мне разрабатывать отдельную компоненту (модуль), который легко портировался бы между проектами, или который легко можно было бы отдать на тестирование другому разработчику, как например в joomla - скопировал папку с компонентой, а в ней и модели с вьюшками, и контроллер, а также правила роутинга (ну не понравилась мне классическая {controller}/{action}/{id}), потому  я и вынес в отдельную папку все добро от одной компоненты, а для обработки определения текущей вьющки - создал базовый класс для контроллеров, и там пишем что-то вроде этого:

    protected override ViewResult View(string viewName, string masterName, object model)

    {
       string component = ControllerContext.RouteData.Values["controller"].ToString();
       string view = viewName == "" ? ControllerContext.RouteData.Values["action"].ToString() : viewName;
       return base.View(string.Format("~/Components/{0}/Views/{1}.aspx", component, view),
                           string.Format("~/Components/{0}/Masters/Site.master", component), model);
    }

    мастерпейдж тоже идет с контроллером, по дефолту - у него указывается мастерпейдж сайта, но мне хотелось чтобы у каждой компоненты можно было его менять :)

    итого получилось вот таккая структура:



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

    Trace/Call stack вызовов в произвольном месте

    Необходимо логировать sql запросы, а также иерархию вызовов, откуда этот запрос пришел в класс для работы с БД
    Так нашел свойство: System.Environment.StackTrace
    Выдает реальный трейс вызовов в любом месте кода :) (так же как и при эксепшене)

    Узнать ширину/высоту документа

    Сегодня возникла тривиальная задача - узнать ширину, высоту документа, в котором загружен сайт, собственно вот так:

     function getClientWidth() {
                return document.compatMode == 'CSS1Compat' && !window.opera ? document.documentElement.clientWidth : document.body.clientWidth;
            }

    function getClientHeight() {
                return document.compatMode == 'CSS1Compat' && !window.opera ? document.documentElement.clientHeight : document.body.clientHeight;
            }

    Директивы ASP.NET Pages

    Недавно обнаружил для себя директиву - <%@ MasterType , оказалась достаточно удобной, для получения доступа к свойствам мастерпейджа, и тогда решил проверить - какие же еще директивы страниц я не знаю, да и прочесть про те что знаю еще разок

    1. <%@ Assembly Name="assemblyname" %> || <%@ Assembly Src="pathname" %> - директива подключения сборки на странице, для того чтобы страница имела доступ к классам и интерфейсам этой сборки во время компиляции.
    Указывается название сборки или путь до файла (файл кода), содержащего описания нужных классов/интерфейсов
    Как правило - все необходимые сборки подключаются в файле
    web.config, но не всегда нужно для всего проекта подрубать какие-либо сторонние компоненты

    2. <%@ Implements Interface="InterfaceName" %> - указывает, что текущая страница (или контрол) реализует указанный интерфейс, да и все :) хотя я обычно просто наследую необходимые страницы от нужных мне интерфейсов

    3. <%@ Import Namespace="YouNamespace" %> - импортирует namespace на страницу, т.е. то же что и using YouNamespace, но только на самой странице.
    Как и при
    using все классы, интерфейсы, перечисления и т.п. будут доступны, но уже в части разметки! Это действительно удобно, когда нужный класс находится в слишком глубоком namespace

    4. <%@ MasterType VirtualPath="~/Masters/Simple.master”" %> - вот это зачетная вещь! если на странице указать в этой директиве путь в используемому мастерпейджу, то страница получит доступ ко всем свойствам мастер страницы при помощи классического свойства страницы Master, т.к. теперь это будет типизировання ссылка на Master Page.

    а) создаем мастер страницу
    б) добавляем в него свойство
    public string GetHi { get { return "Hi!"; } }
    в) создаем страницу и указываем у нее наш мастерпейдж
    г) в директиве
    MasterType также указываем путь к мастеру
    д) теперь на странице можем просто получить доступ к свойству на мастер пейдже при помощи кода:
    Master.GetHi

    Я думаю - это прикольная фича, а вы как считаете?

    5. <%@ OutputCache Duration="1000" %> - управляет параметрами кеширования контрола/страницы, позволяет полностью закешировать контрол, так, что .net даже не будет его загружать на страницы, а лишь при рендеринге вставит на его место закешированный HTML. параметров там много, по этой теме можно даже отдельную статью сделать, в кратце как пользоваться можно почитать тут

    6. <%@ Page Language="C#" - уж с этой директивой все знакомы, но на всякий случай -
    а)
    CodeFile указывает какой кодовый файл использовать для обработки событий
    б)
    Inherits какой partial класс генерировать для страницы
    в)
    Language="C#" язык программирования
    г)
    MasterPageFile="../MasterPage.master" путь к мастер странице
    д)
    Async="true" асинхронная ли страница
    е)
    ValidateRequest="true" производить ли проверку посылаемых данных на безопасность (по умолчанию включена, в таком случае в TextBox html теги не введешь)
    ж)
    Trace="true" отображать ли информацию о сервере и загрузке контролов на странице

    Думаю этих атрибутов для большинтсва случаев достаточно (маквалидацию не включил специально)

    7. <%@ PreviousPageType VirtualPath="~/Tabs.aspx" %> - как и с мастепейджом - эта директива позволяет нам использовать свойство PreviousPage как типизированную ссылку на страницу, с которого пришел PostBack на нашу (по умолчанию PreviousPage имеет тип Page)

    8. <%@ Reference Page="~/Tabs.aspx" %> - определяет, что текущая страница имеет доступ к классу страницы или контрола, путь которого указан в соответствующем атрибуте.

    Думаю удобно, если необходимо создать контрол динамически, или при FindControl привести найденый объект к соответствующему типу

    9. <%@ Register assembly="Org.Eurekaa.DNJ.UI" namespace="Org.Eurekaa.DNJ.UI.WebControls" tagprefix="dnj" %> - одна из самых частоиспользуемых директив на страницах, т.к. она позволяет нам прицепить на странице контрол по указанному пути, сборке, или namespase

    Чтобы прицепить контрол по пути - нужно указать путь к нему в атрибуте Src, задать tagprefix и tagname, да и все в общем

    чтобы заюзать контролы из сборки - достаточно как в примере указать сборку, пространство имен и TagPrefix, все классы пространства имен, являющиеся контролами становятся автоматически доступными на странице


    Итак, вроде все рассмотрел, хотя и кратко, но думаю этого достаточно.
    Как минимум - для себя открыл пару новых прикольных (хотя и врядли пригодящихся) директив, но бывают и нужны, например
    Import - на ashx хендлерах (хотя код можно вынести), или PreviousPageType - просто для удобства

    Failed to generate code for the service reference WCF

    Итак, есть WCF сервис и есть приложение, его использующее.

    При попытке добавить в приложение сервис другого проекта - Failed to generate code for the service reference...

    Использую Visual Studio 2010, и оказалось что дело именно в ней! у мну RC, в релизе может и исправили, но пока поюзаю RC.

    Собственно как справился с ситуацией:
    1. удалил референс
    2. сохранил проект
    3. перезапустил студию
    4. добавил референс -все заработало :)

    Microsoft Silverlight 4 Offline Documentation

    This package contains the MSDN developer documentation for Silverlight 4.

    Shadowbox

    Для тех кто не знает:
    Shadowbox - javascript библиотека, позволяющая отобразить произвольный контент внутри модального (относительно страницы) окна, как заюзать можно почитать тут

    Для тех кто уже знает собственно новость:
    Теперь Shadowbox скачивается с сайта как 1 js файл (+ файл стилей, несколько картинок и флешек), т.е. сейчас сайты, использующие shadowbox, будут чуть быстрее подгружаться т.к. не придется задумываться как объединить javascript файлы в один. И нам не нужно задумываться - какой же адаптер использовать, достаточно выбрать на сайте.


    Не запускается программа в Windows 7

    1. попробуйте запустить ее от учетной записи администратора, для этого: кликните по файлу правой кнопкой мыши -> "Run as administrator"

    2. возможно программа не поддерживает Windows 7 и ее стоит запустить в режиме совместимости: кликните по файлу правой кнопкой мыши -> "Troubleshoot compatibility", затем выбрать параметры, соответствующие той операционной системы, на которой программа точно запускалась

    3. программа могла быть заражена вирусом и внутренний "защитник windows" не дает ей запуститься, проверьте приложение на вирусы

    4. возможно программа x64 разрядная, а ваша ОС - нет, найдите программу под вашу ОС

    5. Возможно у вас устаревшая программа, и ее разработчики уже написали новую версию приложения для Windows 7, в таком случае - стоит обновить приложение с сайта разработчика

    6. отключить антивирус, файрволл, зашитника windows, и тогда может она у вас запустится

    7. гуглить - почему не запускается именно эта программа на windows 7

    8. для опытных - почитать тут

    Использование своего шрифта в CSS

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

    Делается типа все просто - указал урл подгрузки и все, но не для IE 6, да и не для IE в принципе.
    Чтобы загрузить шрифт для IE - необходимо подгружать eot файл для шрифта.
    В итоге имеем:

    @font-face {
    font-family:Helios; /* название шрифта (задается как душе угодно) */
    src: url("helios.eot") /* EOT файл для IE */
    }

    @font-face {  font-family:Helios;  src: url("helios.ttf") /* TTF файл шрифта для браузеров, поддерживающих CSS3 */ }
    если у вас нет EOT файла, то его можно получить на основе файла шрифта на сайте http://www.kirsle.net/wizards/ttf2eot.cgi, для этого достаточно загрузить на сайт шрифт, скачать EOT файл и скопировать пример использования. 

    15 бесплатных мини расширений для Visual Studio 2010

    Почти все кто работает с Visual Studio, слышал или использовал Resharper(R#), плагин расширяет стандартный Intellisense и делает многое другое. Я сильно привык к его удобствам, которые он мне предоставлял в VS2008 и при установке VS2010 RC, не задумываясь, пошел качать новую тестовую версию ReSharper 5.0 Nightly Builds, чтобы написать тулзу для парсинга логов.

    Установка VS2010 прошла гладко, сначала я решил поработать стандартными средствами IDE. Было странно, что по умолчанию не было включено отображение синтаксических и др. ошибок с их подчеркиванием, которые я установил вручную в «Tools -> Options -> Text Editor -> C# -> Advanced». Вроде бы было лучше, чем в VS2008, но чего-то всё же не хватало. Я установил R#, в C# коде он работал отлично, но при открытии XAML, он вел себя просто ужасно, появлялись тормоза и он начинал хаотично подчеркивать ошибочными волнами стандартный код, видимо мне не повезло со скаченным билдом.

    Долго не мучаясь, я удалил R# и начал «кодить ручками», но в силу моих привычек было ощущение, что у меня забрали пару пальцев и я начал искать альтернативы в результатах google-а. Они меня привели на сайт Visual Studio Gallery, за 2+ недели использования студии, я установил около 8 расширений, которые сделали VS2010 удобнее для меня, при создании данной статьи я решил увеличить их список и опробовать ещё парочку популярных расширений.

    1. Go To Definition

    В VS2010 для перехода к определению типа и т.п. используется по умолчанию клавиша F12, не знаю как Вам, а мне хотелось что-то наподобие ctrl+щелчок. Открыл настройки, и у меня не получилось этого сделать, пошел гуглить и нашел расширение, которое при нажатии ctrl начинает подчёркивать типы и т.п., при щелчке по которому будет произведён переход.

    2. Triple Click

    Данное расширение позволяет полностью выделить строку с помощью тройного клика, обычно я это также делаю с помощью нажатия на клавиши Home -> Shift + End.

    3. Hide Main Menu

    Расширение прячет главное меню VS2010 аналогично IE8, появляется при нажатии на клавишу Alt, у меня разрешение на ноутбуке по высоте 768px.


    4. ItalicComments

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


    5. MoveToRegionVSX

    Расширение для перемещения куска кода в регион. Выделяем код, потом в контекстном меню выбираем «Move To Region», появляется окошко со списком всех регионов, в котором нужно сделать выбор.


    6. Word Wrap with Auto-Indent

    Расширение, которое позволяет редактору кода включить перенос не вмещающихся слов, после установки появляется в «Edit -> Advanced -> Word Wrap» для использования по умолчанию «Ctrl+E, W» для включения и выключения.
    Было:

    Стало:


    7. Regex Editor

    Расширение, которое делает написание регулярных выражений более удобным, а также может служить помощником при их написании. Окно появляется автоматически при создании класса Regex, или при наведении на его строковый параметр и нажатия Ctrl+щелчок.


    8. GradientSelection

    Данное расширение делает окантовку при выделении кода, также в VS2010 код при выделении не теряет свой цвет, как было в VS2008.
    Было:

    Стало:


    9. Selection Foreground

    Для тех, кому нравиться вариант VS2008, есть дополнительное расширение.


    10. StructureAdornment

    Расширение создаёт цветные линии, которые визуально объединяют начало и конец блоков, а также при наведении на линию отображает начальные строки всех родительских блоков. Содержит внутри себя 4 не визуальных расширения: BlockTagger, BlockTaggerImpl, SettingsStore, SettingsStoreImpl.
    Автор данного расширения написал несколько различных расширений, которые все вместе есть в AllMargins.



    11. Highlight all occurrences of selected word

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

    Стало:


    12. Find Results Highlighter

    В VS есть окно результатов поиска(Find Results) при поиске через «Find in Files» или Ctrl+Shift+F. Данное расширение выделяет цветом совпадающие значения.
    Было:

    Стало:


    13. Visual Studio Background Customizer

    Данное расширение позволяет выбирать другой плиточный фон рабочего поля или задать собственный рисунок, появляется новый пункт меню в «Tools -> Customize background…»



    14. Visual Studio Color Theme Editor

    Данное расширение позволяет делать тонкую настройку цветов элементов IDE VS2010, есть несколько тем сразу, а также возможность создавать свои собственные, в главном меню появляется пункт «Theme».



    15. IntelliSense Presenter

    Расширение заменяет стандартное окно Intellisense при кодинге на более красивое WPF представление, которое имеет в правом нижнем углу ссылку на главную страницу MSDN-а :)



    Заключение

    Конечно можно спорить о необходимости установки некоторых из этих расширений или о том, что Resharper кручи всех на свете, но он платный, а также как говорится: На вкус и цвет, фломастеров нет.
    14 расширений из этого списка в общем весят 689КВ(!) и «Visual Studio Color Theme Editor» весит 751КБ, общий вес 1,4МБ. И не забудьте, что расширения могут обновится в любой момент, поэтому рекомендую включить автообновление в «Tools -> Environment -> Extension Manager».

    Хотел бы также заметить, что данные расширения делаю VS2010 более дружелюбной и удобной в работе, ну а также не забывайте заходить в родные настройки, которые позволяют более тонко настраивать ваш рабочий инструмент Visual Studio.

    UPDATE: Статья участвует в конкурсе

    Visual Studio 2010 and .NET Framework 4 Training Kit

    Апрельский Training Kit по Visual Studio 2010 и .NET Framework 4, очеь рекомендую для ознакомления всем :)

    Silverlight Toolkit

    The Silverlight Toolkit is a collection of Silverlight controls, components and utilities made available outside the normal Silverlight release cycle. A product of the Microsoft Silverlight product team, the Silverlight Toolkit adds new functionality quickly for designers and developers, and provides the community an efficient way to help shape product development by contributing ideas and bug reports. It includes full open source code, unit tests, samples and documentation for over 26 new controls covering charting, styling, layout, and user input.

    Overview: http://www.silverlight.net/content/samples/sl3/toolkitcontrolsamples/run/default.html

    Facebook Toolkit: Could not deserialize data returned from server

    Подробное обсуждение проблемы тут

    Там же и ссылка на скачивание сборки для ASP.NET, но для Silverlight нет, потому рекомендую сразу качать бету 3.1, хотя в сборке 48944 фикс проблемы тоже присутствует

    Кстати говоря, после распаковки не забудьте разанлочить файлы dll (правой кнопой мыши по файлу -> в правом нижнем углу кнопка unlock, если ее нет, то все уже в порядке)

    System.UnauthorizedAccessException: Invalid cross-thread access error

    Столкнулся с проблемой - в Silverlight нельзя изменять свойства компонент во время обработки результатов какого нить асинхронного вызова (в отдельном потоке). Казалось бы - вроде все одно - контрол и код едины, ни каких постбеков на сервер с передачей состояний нет, а вот и не работает, получаем - System.UnauthorizedAccessException: Invalid cross-thread access error

    В Silverlight очень просто это обходится - при помощи класса Dispatcher.

    Вырезка из msdn:
    "Объект Dispatcher поддерживает очередь рабочих элементов для заданного потока с приоритетами.

    Когда для потока создается объект Dispatcher, он становится единственным объектом Dispatcher, который может быть связан с потоком, даже если этотDispatcher остановлен.

    При попытке приложения получить CurrentDispatcher для текущего потока, в случае, если с потоком не связан объект Dispatcher, выполняется создание объекта Dispatcher.

    Если Dispatcher остановлен, его невозможно перезапустить.

    В WPF объект DispatcherObject доступен только для Dispatcher, с которым он связан. Например, фоновый поток не может обновить содержимое элемента управления Button, связанного с Dispatcher потока Пользовательский интерфейс. Чтобы фоновый поток получил доступ к свойству Content элемента управления Button, он должен делегировать работу объекту Dispatcher, связанному с потоком Пользовательский интерфейс. Это делается с помощью метода Invoke или BeginInvoke. Метод Invoke является синхронным, а BeginInvoke — асинхронным. Данная операция добавлена в очередь объектаDispatcher с заданным DispatcherPriority.

    Если BeginInvoke вызывается для остановленного Dispatcher, свойству состояния возвращаемого объекта DispatcherOperation присваивается значениеAborted.

    Все методы объекта Dispatcher за исключением DisableProcessing являются независимыми от потока."

    Итак, теперь становится ясно в чем проблема, и для ее решения необходимо чтобы фоновый поток передал обязанности диспатчеру связанному с пользовательским интерфейсом.

    для этого необходимо лишь поместить часть кода в this.Dispatcher.BeginInvoke и больше ничего не менять, для примера я немного изуродовал свой код и представляю ниже:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
    GameState.OnLoggined += (obj, erg) =>
    {
    GameState.FacebookAPI.Users.GetInfoAsync((info, s, ex) =>
    {

    this.Dispatcher.BeginInvoke(() =>
    {
    if (info != null)
    litUserName.Text = info[0].name;
    else
    litUserName.Text = "Guest";
    });

    }, null);
    };

    }

    В данном примере, на загрузке контрола асинхронно выполняется функция GetInfoAsync, по ее завершении мы имеем данные пользователя, авторизовавшегося в нашем приложении. Я всего навсего хотел было вывести имя пользователя в компоненту litUserName, но, как оказалось, не имел доступа к ним. Для получения доступа мне достаточно было обернуть часть кода в this.Dispatcher.BeginInvoke(() => { /* my code */ } ); и все решилось само собой, т.к. код выполняется теперь в контексте потока отвечающего за пользовательский интерфейс (или типа того)