К основному контенту

Сообщения

Сообщения за 2012

Visual Studio 2012 Extension - вертикальные вкладки

Не так давно перебрался с 2010 Visual Studio (далее VS) на 2012. Дольше всего от перехода на новую версию меня останавливало отсутствие вертикальных вкладок для открытых файлов. Поработав с вертикальными вкладками в 2010 студии я уже не мог продолжать работать без них. Настолько с ними удобнее. И поэтому решил поделиться своим знанием. Вдруг кто-то еще не попробовал их? Чтобы установить вертикальные вкладки нужно скачать Extension(расширение для VS) по ссылке  Productivity Power Tools . Установив расширение, нужно в VS перейти в Tools/Options/Productivity Power Tools и выбрать Place tabs on the Left. Результат применения этого расширения: Цвета вкладок подсвечены в зависимости от проекта.

Работа для Web - программиста.

Сегодня я хочу поговорить о работе или скорее о тех, кто эту работу нам предоставляет. Так сказать об идеальной работе для программиста, а может и не только программиста. Бывает, что спрашиваешь себя: "Нравится ли тебе место в котором ты работаешь, твоя должность, круг задач, условия труда, отношения в коллективе? Этого ли ты хотел или нужно идти дальше?" И особенно часто эти мысли начинают посещать тебя, если на работе все последние действия руководства вызывают у тебя удивление, недоумение, но никак не способствуют повышению мотивации и желания работать. И ты сидишь, думаешь и взвешиваешь: да здесь меня все устраивает, а здесь я бы хотел лучших условий. Вот и я задумался и решил оформить все свои мысли на бумаге, чтобы, прежде всего для себя самого, определить какие условия работы были бы для меня близки к идеальным. С высоты своего опыта (а я успел поработать в разных компаниях крупных и не очень) могу сказать совершенно точно, что сейчас хотел бы выбрать компанию, к

MVC. Как передавать в Controller коллекцию объектов.

Когда мы передаем в Controller один объект, то все просто и понятно. А что если нам нужно принимать коллекцию объектов? Для примера возьмем следующую модель сотрудников: public class Employee() { public string FirstName {get;set;} public string SecondName {get;set;} } На сервере нам нужно получить коллекцию пользователей public ActionResult ActionName(List<Employee> employees) { ... } Для передачи коллекции в контроллер нужно сформировать такую разметку (сотрудников у нас будет n+1): <form method="post" action="/ControllerName/ActionName"> <input type="text" name="employees[0].FirstName" value="" /> <input type="text" name="employees[0].SecondName" value="" /> <input type="text" name="employees[1].FirstName" value="" /> <input type="text" name="employees[1].SecondName" value="" /> ... <

Чем отличаются RenderPartial и Partial, RenderAction и Action

Чем отличаются RenderPartial и Partial, RenderAction и Action? На этот вопрос попытаюсь ответить так: если мы используем приставку Render, то результаты выполнения сразу встраиваются в выходной поток. С приставкой Render - это void метод, поэтому в коде мы должны закрывать строку точкой с запятой и не можем использовать @ перед вызовом. Правильный вызов RenderPartial(RenderAction  аналогично): @{      Html.RenderPartial("View") ; } Без приставки Render Html.Partial (как и Html.Action) - возвращает html разметку. Разметка хранится в буфере, а потом также встраивается в выходной поток. Поэтому первый способ немного эффективнее. Правильный синтаксис (без точки с запятой): @Html.Partial("View")

C# GET. Пишем Generic метод.

Я уже писал о том, как отправлять запросы на сторонний сервер с помощью POST . Сегодня напишу как сформировать GET запрос. Зачастую я использую GET запрос  для получения ответа в виде JSON и сразу десериализую JSON строку в объект. Поэтому метод у меня будет универсальный. Для универсальности будем использовать Generics. Итак, смотрим: /// <summary> /// Generic GET Метод /// </summary> /// <param name="url">Адрес, по которому мы обращаемся с параметрами для GET запроса</param> //Здесь T - это объект, в который мы будем десериализовать JSON ответ public static T GetMethod<T>(string url) {    object value = null;    var reqGet = WebRequest.Create(url);    var resp = reqGet.GetResponse();    var stream = resp.GetResponseStream();    if (stream != null)    {       //читаем поток в строку       StreamReader sr = new StreamReader(stream);       var srToString = sr.ReadToEnd();       //десериализуем JSON строку в объект       return JsonConvert.

Как определить с помощью jquery (javascript), что к вам на сайт зашел пользователь с iPhone.

Наша задача - перенаправлять пользователя, который зашел на сайт с iPhone на приложение в AppStore. Для определения платформы будем использовать свойство userAgent, которое поддерживается всеми основными браузерами. //Если userAgent содержит слово iPhone, то перенаправляем в AppStore var isiPhone = navigator.userAgent.toLowerCase().indexOf("iphone"); if (isiPhone > -1) { if (confirm("Перейти к приложению для iPhone?")) { window.location = "http://itunes.apple.com/ru/app/ourapp"; } } Если мы не хотим быть назойливыми и не хотим показывать сообщение каждый раз, когда пользователь заходит на сайт, то можно хранить информацию о просмотре сообщения в cookie пользователя. Для записи и чтения cookie я использую удобный плагин jquery.cookie.js. С плагином код будет выглядеть так: var cookieName = "PhonePopUp"; var appstore = $.cookie(cookieName); //Если userAgent содержит слово iPhone и нет coookie PhonePopUp, то перенаправл

Мониторинг нагрузки на сайт под управлением IIS средствами Windows Server. Показатели посещаемости.

Как мониторить нагрузку на сайт? Если мы хотим добиться бесперебойной работы сайта, то мы должны быть постоянно в курсе, что происходит с сайтом в данный момент времени. Чтобы в случае возникновения проблем быстро среагировать на них. В компании, где я сейчас работаю, в кабинете программистов висит ЖК телевизор-монитор, подключенный к компьютеру. На мониторе отображаются графики нагрузки на сервера, список  всех работающих сайтов со статусом доступности, а также онлайн статистика посещаемости из Google Analytics (в режиме реального времени отображается количество текущих пользователей на основном сайте в разрезе географии). Итак, какие показатели Веб-сервера мы считаем полезными для отображения на мониторе. Их четыре: % загрузки процессора, % использования выделенной памяти, всего запросов методов в секунду (Веб-служба), запросов в секунду (ASP.NET Apps). С первыми двумя все понятно. Счетчик В сего запросов методов в секунду (Веб-служба) - это  частота запросов HTTP, которые

IIS (Internet Information Services) и applicationHost.config. Изменение доменных привязок.

Сегодня затронем тему настроек IIS (Internet Information Services). Речь пойдет о версии IIS 7.0 (7.5). Допустим у вас есть  большое количество поддоменов, которые нужно привязать к сайту или быстро исправить на уже существующих привязках IP адрес. Стандартный интерфейс IIS позволяет редактировать привязки по одной, что в нашем случае не очень-то удобно. См. картинку Чтобы ускорить процесс, нужно вспомнить, что все доменные привязки (и не только, а и другие настройки) хранятся в конфигурационном файле applicationHost.config. Данный файл находится по адресу C:\Windows\System32\inetsrv\config\ В файле отредактировать привязки можно очень быстро.

Мобильное приложение (интернет магазин) для iPhone на C# (Monotouch + Monodevelop)

Итак, замкнулся первый цикл разработки нашего приложения для iPhone.  Долгая дорога от идеи до реализации. Сегодня ночью наше приложение добавили в  AppStore Ссылка itunes.apple.com Если есть возможность, установите и напишите свою оценку: что понравилось, а что нет. Заранее спасибо. В предыдущих сериях: Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть I. Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть II. Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть III.

Пример записи методов (функций) в языке Razor MVC

Пример записи функций в языке Razor. Все методы всегда реализовывал в контроллерах, а недавно нужно было добавить простенький метод во View. Оказывается сделать это можно так: @functions {     static int MySimpleMethod(int id)     {          return id*5;     } } @* Вызов самого метода в теле View *@ @MySimpleMethod(5)

Представление обычного текста и html кода с помощью разметки Razor MVC C#

Для новичков в MVC хочу дать пару советов как записывать обычный текст и html код в разметке Razor если на странице используются блоки кода. Этот вопрос возник у меня самого, когда я приступил к изучению MVC. Например, текст находится в теле оператора if.  В этом случае перед отображаемым текстом нужно поставить   @:   @if (Condition) { @:Отображаемый текст <br/> }   Если отображаемый текст заключен в html теги, то дополнительных символов ставить не нужно. Пример: @if (Condition) { <div>Отображаемый текст</div> } Если текста много и он перемешан с    html тегами, то весь блок можно заключить в тег разметки  Razor  <text> @if (Condition) { <text> <div>Отображаемый текст</div> Отображаемый текст <div>Отображаемый текст</div> Отображаемый текст </text> } Если мы хотим отобразить строковую переменную с html кодом, то при обычном выводе теги html кодируются в последовательность вида "&lt;&

C# и API Facebook. Пример размещения записи на стене пользователя с помощью API.

В связи с пользующимися повышенной популярностью статьями  C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)  и  Пример взаимодействия с Odnoklassniki Rest API на C#   продолжаю эту серию публикаций статьей по работе  с API Facebook. Задача: добавлять на стену пользователя сообщение через API Facebook. Решение: Первое, что мы сделаем - это р егистрируем наше приложение на  https://developers.facebook.com После регистрации нам будут доступны AppID и AppSecret приложения. Чтобы отправлять данные от лица пользователя необходимо предложить ему авторизоваться на сайте  Facebook. Для этого предлагаем ему перейти по следующей ссылке: string.Format( "https://www.facebook.com/dialog/oauth?client_id={0}&redirect_uri=1}&response_type=code&scope=publish_stream",   AppID   , RedirectUri); где  AppID  - ID нашего приложения. А  RedirectUri - это адрес куда вернется пользователь после авторизации.  Также нужно уточнить, что  scop

Монетизация блога. Партнерская программа от интернет-магазина обуви Sapato.ru

Может ли реклама в блоге приносить хоть сколько-нибудь значимый доход - вот вопрос, который на днях задал себе  я.  Думаю, что каждый блоггер рано или поздно подымавает над тем: "Не разместить ли мне рекламу в своем дневнике?". Конечно, не скрою, навязчивая реклама, да и реклама в общем, раздражает многих и меня в том числе. Поэтому я решил не ляпать на каждом клочке свободного места пестрый баннер, а выбрал одного более менее крупного игрока на рынке интернет торговли и решил поработать с их партнерской программой. Итак, это интернет-магазин обуви  Sapato.ru  Ссылка на партнерскую программу магазина нашлась в футере главной страницы. Пройдя нехитрую систему регистрации, я получил доступ к личному партнерскому коду и списку различных инструментов для рекламы данного магазина:  ссылка с партнерским кодом, баннеры, xml-каталог. В процессе регистрации потребовались сканированные копии документов: паспорт, ИНН, страховое свидетельство. Сразу хочу отметить одну важную

Авторизация Membership пользователей сквозь сайты с разными суб доменами. Membership Cross Sub Domain Authorization.

Задача:  Есть несколько серверов, на которых размещены сайты с доменами вида: domain.ru, sub1 .domain.ru,  sub2 .domain.ru,  sub3 .domain.ru  и тп. То есть эти сайты  объединяет    единый корневой домен. Необходимо настроить авторизацию на этих сайтах таким образом, чтобы пользователь осуществляя вход на одном сайте, автоматически считался авторизованным на другом. Авторизация на сайтах реализована через Membership Provider. Пользователи хранятся в одной базе данных. Решение: Конечно же для решения этой задачи не обойтись без Cookies. Поэтому первое, что мы сделаем -  это в web.config включим использование  Cookie. Здесь небольшое отступление. Для того, чтобы  Cookie читалась на всех суб доменах верхнего уровня необходимо в качестве домена для  Cookie  указать корневой домен с точкой (для нашего примера . domain.ru ) Смотрим как сделать эти действия с помощью одной строчки в  web.config <authentication mode="Forms"> <forms cookieless="

Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть III.

Всем привет, я снова с вами! Прошел достаточно длинный промежуток времени c момента моего последнего сообщения.  Жизненные перипетии, неопределенность с работой... Но это все лирика. Сегодня хочу рассказать больше о нашем приложении, которое мы сделали для iPhone. Напоминаю, что приложение мы сделали на C# не написав ни одной строчки кода в Objective-C. Этот пост предназначается тем, кто мучается с выбором платформы для разработки приложений под iPhone. Ниже я привожу описание приложения разработанного с помощью Monotouch на C#. Итак, это приложение для интернет магазина ЗАКАЖИ. Вкратце описание функционала. Приложение  интернет магазина  ЗАКАЖИ для iPhone предоставляет пользователям возможность находить товар в каталоге через меню, осуществлять поиск по всему ассортименту. Пользователь может просматривать карточку товара: цены на товар, фотографии товара, характеристики товара, варианты доставки. Товары можно добавлять в корзину для последующей покупки. После оформления зака

Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть II.

И снова здравствуйте! Продолжаю серию публикаций про разработку приложения под iOS с использованием Monotouch и Monodevelop. В прошлом сообщении я остановился на этапе получения лицензии. Для завершения квеста нам требовалось отправить в Apple документы о компании (выписку из ЕГРЮЛ) в двух вариантах: по-русски и заверенный перевод на английском. С этой задачей мы справились. Перевод оформили и заверили у нотариуса. Отправили по факсу. Потом нам пришло письмо с просьбой перезвонить по указанному номеру. Из Apple по какой-то причине до нас не дозвонились. Я внес на счет Скайпа 5 долларов и мой коллега позвонил по указанному номеру(почему-то Ирландскому). Он поговорил с девушкой на том конце провода минут пять(естественно по-английски), и нас допустили к следующему этапу. Следующий этап  - это оплата. Как я уже писал, для оплаты нужно было отправить по факсу все данные кредитной карты. Делать нечего, отправили данные и стали ждать.  Через два дня с карты списали деньги и пришло

MVC. Sharing Controllers and Views.

Задача . Есть повторяющиеся блоки в связке Contoller+View, которые одинаковы для нескольких сайтов и хочется добавить их для этих сайтов как ссылку на библиотеку, так сказать 'расшарить'. А редактировать уже в одном проекте. Решение . Для решения этой задачи будем использовать библиотеку  Razor Generator . Razor Generator позволяет делать прекомпиляцию наших View. Мы можем вынести файлы в отдельную библиотеку, скомпилировать их и они станут доступными в других проектах. Посмотрим на примере. Создадим пустой проект. Назовем его Shared Views. В проекте повторим структуру MVC приложения: создадим папки Controllers, Models и Views и перенесем в папки файлы, которые мы хотим расшарить. Добавим необходимые ссылки на библиотеки MVC.  Через NuGet добавим библиотеку RazorGenerator. В  свойствах каждого Представления(View) укажем: Теперь можно проверить прекомпиляцию с помощью команды RunCustomTool. Для этого необходимо выбрать файл представления и вызвать контекстное мен

Индексация блога на платформе blogger (blogspot) в Яндексе за неделю.

Прошу прощения за долгое молчание. Впредь обещаю писать чаще. Сегодня отвлечемся от программирования и затронем тему SEO (Search Engine Optimization). Могу предположить, что любой начинающий и не только блоггер хочет, чтобы его статьи были  донесены до целевой аудитории. Не секрет, что большинство посетителей переходят на блоги через поисковые системы Яндекс, Google и др. Выбрав блог на платформе blogpost я сначала не задумывался о том, как он будет индексироваться поисковыми системами и будет ли вообще. Но со временем, обратившись к этому вопросу, я понял, что Google индексирует мой блог на ура, а Яндекс и знать о нем ничего не знает. В интернете подсказали, что о новом сайте (в данном случае блоге) нужно сообщить Яндексу. Для этих целей существует  сервис "Сообщить о новом сайте'  Я добавил свой блог и начал ждать. Прошло 2 недели - результат нулевой. Тогда я добавил свой сайт в  Вебмастер  Яндекса с целью отслеживать посещения моего блога поисковым роботом. Прошло

Monotouch и Monodevelop. Программируем для iOS на C# на примере нашего проекта. Часть I.

Сегодня я начинаю серию публикаций, посвященных разработке нашего первого приложения под iOS на C#. Так как это проект новый для нас, то статьи будут появляться по мере нашего продвижения в этом вопросе. Предыстория . Руководство поставило задачу своими силами сделать приложение Интернет-магазина для iPhon-ов и iPad-ов. А в дальнейшем и под Android. Как разработчики на C# мы стали изучать варианты реализации. И остановились на  Monotouch . Monotouch - это надстройка к Monodevelop, которая позволяет писать приложения под iOS на C#. Код компилируется в нативный objective C и прекрасно работает под iOS. Причем Monotouch позволяет писать не только для iOS, но и для Android. Как раз то, что нужно. Вы спросите, что такое Monodevelop? Это среда разработки на C#, работающая под Mac OS. Так сказать аналог VisualStudio для Mac-ов. И все же почему Monotouch? Ответ прост - низкий порог вхождения. Зная C# можно сразу начинать работу над приложением не тратя время на изучение нового языка про

Хранить значения Web.config appSettings и handlers в отдельных файлах.

Со временем, работая с большим проектом, приходишь к тому, что записей appSettings и handlers становится очень много. Чтобы не путаться в большом файле Web.config есть элегантное решение: вынести значения appSettings и handlers в отдельные файлы. Для того, чтобы вынести значения в отдельный файл используется атрибут configSource. Запись в Web.config меняется на следующую: ..... <appSettings configSource="appSettings.config" /> ...... <handlers configSource="handlers.config" /> ........ Соответственно, файл appSettings.config будет выглядеть так: <appSettings>     <add key="ключ" value="значение" />     <add key="ключ" value="значение" />     .... </appSettings> А файл handlers.config: <handlers>     <add name="Имя" verb="GET,POST" path="путь" type="тип" />     .............. </handlers>

Пример взаимодействия с Odnoklassniki Rest API на C#.

Итак, как и обещал, продолжаю тему взаимодействия с различными API. В прошлый раз писал про  API ВКонтакте , сегодня напишу про API Одноклассников. Первое, что нам нужно сделать - это зарегистрироваться как разработчик на Одноклассниках. Сделать это можно по следующей ссылке  Форма регистрации разработчика приложений Получив права разработчика, необходимо зарегистрировать сайт как приложение. Подробно как это сделать можно прочитать  здесь После того как сайт будет зарегистрирован придет письмо, содержащее: Application ID: xxxxxx. Публичный ключ приложения: xxxxxxxxxxxxxxxxxxxxxxxxx. Секретный ключ приложения:  xxxxxxxxxxxxxxxxxxxxxxxxx. Ссылка на приложение: http://www.odnoklassniki.ru/games/xxxxx Используя эти данные можно начать работу с API. Для выполнения запросов к API пользователь должен авторизоваться в Одноклассниках. Добавляем на нашем сайте ссылку для авторизации пользователя: http://www.odnoklassniki.ru/oauth/authorize?client_id={0}&scope={1}&

Получение MD5Hash строки на C#

Внешние Web API зачастую требуют цифровую подпись запросов в виде MD5Hash-а передаваемых параметров. Ниже приведу метод, который я использую для получения MD5Hash. public static string GetMD5Hash(string input) { var x = new System.Security.Cryptography.MD5CryptoServiceProvider(); var bs = Encoding.UTF8.GetBytes(input); bs = x.ComputeHash(bs); var s = new StringBuilder(); foreach (var b in bs) { s.Append(b.ToString("x2").ToLower()); } return s.ToString(); } В скором времени приведу пример, где я использую этот метод в работе с Rest API Одноклассников.

Пример на Css как оформить ссылку с картинкой.

В своей работе приходится также заниматься html-версткой. Поэтому иногда  буду в блоге размещать примеры на Css. Итак, первый пример. Как оформить ссылку с картинкой на Css для продвинутых. Первое время использовал это вариант: <a href="#" title="Ссылка" ><img src="картинка.png" alt="Картинка" width="100" height="100"/></a> Но, как оказалось, для поисковой оптимизации (СЕО) этот способ не совсем удачный - в ссылке должен быть текст. Поэтому сейчас использую следующий вариант, который, как мне кажется, более красивый и читабельный: <a href="#" title="Ссылка" class="link">Ссылка</a> код для css файла a.link{ display: block; overflow: hidden; background: url('картинка.png ') no-repeat; width: 100px; height: 100px; text-indent: -9000px; }

Отключить запуск ASP.NET Development Server в Visual Studio

Когда у вас несколько сайтов, и вы начинаете отладку в Visual Studio, то на каждый сайт запускается свой ASP.NET Development Server и все они дружно висят в трее. Так как я свои сайты запускаю непосредственно под IIS, то запуск каждого ASP.NET Development Server мне только мешает, создавая легкое раздражение. Как оказалось, отключить запуск ASP.NET Development Server очень легко. Нужно выбрать проект в Solution Explorer, нажать F4 (Свойства проекта) и в закладке Always start when debugging выбрать False Сделать это придется для каждого проекта, но больше ASP.NET Development Server вас беспокоить не будут.

C# десериализация xml.

Недавно я писал о том, как десериализовать json строку в класс . Сегодня я напишу как десериализовать в объект xml файл. Итак, допустим, что мы хотим десериализовать xml файл со следующей структурой: <order id="1234"> <items> <item price="0123"/> <item price="1234"/> <item price="2345"/> </items> </order> Создаем 2 класса: [XmlRoot("order")] public class OrderModel { [XmlArray("items")] [XmlArrayItem("item", typeof(OrderItem))] public List<OrderItem> Items { get; set; } [XmlAttribute("id")] public int Id { get; set; } } public class OrderItem { [XmlAttribute("price")] public int Price { get; set; } } Для класса OrderModel указываем атрибут XmlRoot, который говорит о том, что элемент order является корневым элементом xml файла. Для вложенных элементов указываем атрибуты: XmlAttribute - если речь идет о

C# и Json.NET. Десериализация JSON строки в объект.

В статье  C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)  я писал о том, что возвращаемую от API json строку  я десериализую в класс. Для десериализации я использую библиотеку  Json.NET . Тесты показали, что эта библиотека  позволяет выполнять сериализацию / десериализацию гораздо быстрее чем DataContractJsonSerializer и JavaScriptSerializer. Использование библиотеки очень простое. Например, мы хотим десериализовать json строку в класс Person. Создаем класс: public class Person { [JsonProperty(PropertyName = "firstname")] public string FirstName { get; set;} [JsonProperty(PropertyName = "secondname")] public string SecondName { get; set;} } Для полей указываем аттрибут JsonProperty, где указываем название поля в строке, которую хотим  десериализовать. Для десериализации вызываем следующий метод: var  Person  = JsonConvert.DeserializeObject<Person>(jsonString);  Аналогичным способом можно десериализов

C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)

В статье  C# POST. Отправляем запросы на адрес стороннего сервера  я рассказал про метод, с помощью которого можно работать с различным API, принимающими POST запрос и возвращающими ответ в виде json или xml. Сегодня я хочу написать, как я применял этот метод при работе с API  ВКонтакте. Для примера возьму задачу получения через API списка групп, в которых состоит пользователь. В первую очередь необходимо зарегистристрировать наш сайт как приложение ВКонтакте. Заходим по ссылке  http://vk.com/editapp?act=create&site=1  и подключаем наш сайт. Дальше задача  делится на две подзадачи, а именно: авторизация пользователя и обращение к API для получения списка групп. Для авторизации мы пользователю предлагаем перейти по следующей ссылке: http://api.vkontakte.ru/oauth/authorize? response_type=code&redirect_uri={0} &client_id={1} &scope={2} &display=page , redirect_uri - адрес страницы нашего сайта, куда будет возвращен пользователь после авторизации Вконтак

C# POST. Отправляем запросы на адрес стороннего сервера.

В ходе работы очень часто сталкиваюсь с различными внешними API, которые принимают на вход данные, отправленные через POST запрос, и возвращают результат в виде xml или json. Ниже привожу свой метод отправляющий данные на адрес стороннего сервера через POST: postedData - данные, отправляемые на сервер, postUrl - адрес, по которому мы обращаемся public static HttpWebResponse PostMethod(string postedData, string postUrl) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); request.Method = "POST"; request.Credentials = CredentialCache.DefaultCredentials; UTF8Encoding encoding = new UTF8Encoding(); var bytes = encoding.GetBytes(postedData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = bytes.Length; using (var newStream = request.GetRequestStream()) { newStream.Write(bytes, 0, bytes.Length); newStream.Close(); } return (HttpWebResponse)request.GetResponse(); } Метод возвращает ответ

Зависимость кеша от изменений в базе данных. CacheDependency на примере нашего проекта.

В предыдущей записи в блоге  я писал, что в  своем проекте мы используем CacheDependency для  динамического обновления кеша в зависимости от изменений в базе данных. Теперь пишу об этом более подробно. Итак, CacheDependency позволяет нам устанавливать зависимость между объектом в кеше и строкой в базе данных. Как только строка меняется, обнуляется кеш, идет новый запрос в базу, а в кеш записывается новое значение.Таким образом, мы имеем всегда актуальные данные. При этом данные закешированы, и обновляются только при необходимости. Так как в своем проекте мы используем SQL Server 2008, то для мониторинга изменений мы будем использовать Service Broker. Включается он в базе следующим образом: ALTER DATABASE [База данных] SET ENABLE_BROKER Тут есть одна сложность. Включить брокер можно только в том случае, если база находится в режиме SINGLE_USER. То есть для рабочего проекта придется отключать пользователей. Следующим шагом является программное создание зависимостей кеша.

Выполнение метода асинхронно в отдельном потоке в MVC. BackgroundWorker и Thread.

В своем проекте используем CacheDependency для динамического обновления кеша в зависимости от изменений в базе данных. При первом запуске устанавливаются зависимости: объект в кеше  - строка в базе данных. Если значения в строке таблицы базы данных меняются, то меняется кеш сбрасывается и данные запрашиваются для данной строки повторно. В работе возникла следующая проблема. Если объектов > 500, то первый запуск выполняется долго. Как оказалось, установка зависимостей для каждого объекта со строками базы данных занимает большое количество времени (10-ки секунд), так как для каждого объекта выполняется запрос в базу данных по ключу. А чем больше объектов, тем больше запросов. Чтобы решить эту проблему, я предложил записывать объекты в кеш асинхронно в отдельном потоке. Алгоритм следующий: считываем объекты из базы, отображаем их пользователям и параллельно запускаем процесс записи объектов в кеш. Пользователь видит данные сразу и не ждет пока они добавятся в кеш. Сначала мы хот

Отображение сustomErrors страниц в случае ошибок 400, 404, 500 в MVC

В одном из предыдущих постов я писал о том, как фиксировать ошибки в MVC Сегодня я расскажу как отображать user friendly страницы, если возникли ошибки 400, 404, 500 или любые другие страницы ошибок. Предыстория вопроса. В asp.net данный вопрос решался просто. Достаточно было в файле web.config указать секцию: <customErrors defaultRedirect="~/500.aspx" mode="RemoteOnly"> <error redirect="404.aspx" statusСode="404"/> <error redirect="500.aspx" statusСode="500"/> </customErrors > Либо прописать страницы для отображения ошибок в IIS. В случае с MVC дело обстоит иначе. Так как MVC использует свою схему для маршрутизации, то для подключения страниц отображения ошибок нужно сделать следующее. Во-первых, создадим контроллер, который будет отвечать за отображение наших ошибок пользователю. public class ErrorController : Controller { //id - код ошибки  public ActionResult StatusCode(int id

Событие Page_PreInit в разрезе MasterPage

Страница  asp.net  во время выполнения проходит так называемый жизненный цикл, который состоит из различных событий. Первое из событий в жизненном цикле является событие PreInit. Если мы хотим, чтобы часть кода выполнялась на странице раньше других блоков перед инициализацией элементов на странице, то этот код необходимо поместить в конструкцию: protected void Page_PreInit(object sender, EventArgs e) { //Наш код } Это верно для одной страницы asp.net. А если мы хотим дублировать это событие для всех страниц нашего сайта? Писать для каждой страницы данный код? Не наш метод=) Посмотрим, есть ли решение. Первое, что пришло в голову - это добавить наш Page_PreInit в MasterPage (шаблон для всех страниц сайта), но, как оказалось, в классе MasterPage нет поддержки  метода Page_PreInit и, соответственно, написать Page_PreInit в MasterPage мы не можем. Решение было следующим: В папке App_Code был создан файл BasePage.cs со следующим кодом: //класс BasePage, наследуется от класса

Ошибка авторизации TFS после добавления библиотек через NuGet.

Ошибка, с которой я столкнулся, скорее всего возможна только в корпоративной сети, где политики безопасности устанавливаются администратором. После подключения к проекту библиотек через NuGet в VisualStudio 2010, отключался доступ к TFS (система контроля версий). При попытке работы с TFS после подключения библиотек появлялась следующая ошибка: TF30063: You are not authorized to access [TfsServer].The remote server returned an error: (401) Unauthorized. Самым простым решением был перезапуск VS, но со временем эта ошибка стала раздражать все больше и больше. Оказалось, что во всем виноват наш любимый InternetExplorer. Корпоративные политики безопасности каким-то образом ограничивали доступ к TFS. Решение как всегда было очень простым: Добавить адрес TFS-сервера в список доверенных узлов в настройках безопасности InternetExplorer. После совершения данного действия ошибка более не появлялась.

Изменение размера картинок на c#. Проблемы с качеством итогового изображения.

Сегодня расскажу о схеме работы с картинками, которая используется сейчас у меня на работе. Картинки хранятся в базе в максимальном разрешении. Для вывода на сайте картинка  в зависимости от страницы или блока сжимается до нужного в пикселях размера. Размер пикселей передается в параметрах запроса. На итоговое изображение накладывается watermark, затем картинка кешируется и при повторном обращении уже берется из кеша. В момент отправки клиенту картинке присваивается уникальный Etag и параметры кеширования в браузере. То есть при повторном обращении браузер уже не запрашивает картинку, а берет из дискового кеша. Недавно мы столкнулись с такой проблемой: при изменении gif картинки, качество ее заметно ухудшалось и те решения, которые успешно работали c jpeg, с gif картинками не давали результатов. Решение оказалось достаточно простым. После изменения размера для gif картинок нужно устанавливать: ImageFormat  format = ImageFormat.Png; context.Response.ContentType = "image/pn

CLR процедуры. Проблемой с XML-сериализацией.

Работая с CLR процедурами столкнулся со следующей проблемой: при попытке сериализовать в объект ответ от Web-сервиса с помощью XmlSerializer я получал следующую ошибку на SQL-сервере: Cannot load dynamically generated serialization assembly. Как оказалось, для CLR процедуры, использующей Xml-сериализацию, необходимо создавать отдельную сборку сериализации и загружать эту сборку в SQL-сервер. Чтобы создать сборку сериализации, нужно выполнить следующие шаги: 1. В VS выполнить Build проекта, в котором мы создаем  CLR процедуры. 2. С помощью приложения sgen.exe  создать сборку сериализации. Для этого выполнить в командной строке следующий код: [Путь до приложения  sgen.exe]>sgen.exe /force [Путь до проекта с  CLR процедурами] / SqlServerProject.dll В моем случае: [Путь до приложения  sgen.exe] == C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin; SqlServerProject.dll - это имя сборки моего проекта с CLR процедурами. В папке со сборкой проекта появ

Моя первая CLR процедура

Недавно мне пришлось решать следующую задачу: объединить данные, полученные из Web API с результатами sql запроса, а готовый результирующий сет использовать в sql-процедуре. Для решения этой задачи я обратился к CLR процедурам. CLR процедуры - это хранимые  процедуры, выполняемые на SQL-сервере, но написанные на языке C#. CLR процедуры компилируются в отдельную dll и добавляются в SQL-сервер. Чтобы написать свою первую CLR процедуру, я создал новый проект и назвал его SqlServerProject. В качестве шаблона выбрал CLR Database Project. При создании проекта появилось диалоговое окно с просьбой привязать базу данных. Я указал базу данных, где планировал разворачивать CLR процедуру. Для CLR процедуры необходимо указать уровень доступа. Существует три варианта доступа: Safe, External, Unsafe. Подробное об ограничениях доступа можно почитать здесь.  Для своего проекта я выбрал External, так как для моей процедуры требуется доступ в интернет. В проекте я создал файл с именем St

Оптимизация контента. Сжатие и объединение файлов css и js с помощью библиотеки Combres. Часть II.

Сегодня в продолжение темы про оптимизацию пишу про библиотеку Combres. Итак, Combres  - это библиотека для объединения файлов стилей и скриптов, и сжатия итогового файла. Подключается эта библиотека через менеджер NuGet: После добавления библиотеки в файле web.config появятся необходимые ссылки на библиотеку. А в папке  App_Data появится файл combres.xml  В этом файле и происходят все необходимые настройки. Ниже приведу пример файла: <? xml   version = " 1.0 "   encoding = " utf-8 "  ?> < combres   xmlns = ' urn:combres ' >     < filters >         < filter   type = " Combres.Filters.FixUrlsInCssFilter, Combres "  />     </ filters >     < resourceSets   url = " ~/combres.axd "                    defaultDuration = " 30 "                    defaultVersion = " auto "                    defaultDebugEnabled = " false "                    defaultIgnorePipelineWhe