Автоматизация подписки на рассылку FeedBurner. Часть 3

March 9th, 2010 Alex Nikitin No comments

Заключительная часть трилогии о том, как взять feedburner’овскую капчу, заставить пользователя ввести её и подписать его на рассылку feedburner.

Часть 1, Часть 2

В этой статье разберем серверную часть программы – php-скрипт, задача которого обратиться к сервису feedburner, получить капчу, передать пользователю, принять расшифровку капчи от пользователя и передать feedburner. Я использовал ZendFramework, но в основном по мелочи.

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

Когда мы обращаемся к фидбернеру в первый раз отрабатывает следующий скрипт:

$client = new Zend_Http_Client(/* здесь должна идти строка с адресом рассылки, которую генерирует feedburner */);
$client->setParameterPost(array(
	        'loc'  => 'ru_RU',
	        'uri'   => /* данные вашей рассылки */,
	        'email' => /* данные вашей рассылки */,
	    ));
$resp = $client->request('POST');	// выполняем POST запрос
$headers = $resp->getHeaders();
 
// меняем относительные пути на полные
$response =  str_replace('captcha?','http://feedburner.google.com/fb/a/captcha?', $resp);
$response =  str_replace('="/fb','="http://feedburner.google.com/fb', $response);
 
// В ответ на наш запрос feedburner генерирует форму
// для заполнения с рядом скрытых (hidden) полей.
// Значение этих полей нам нужно достать и отправить
// обратно фидбернеру при следующем обращении
// Здесь я опушу большую часть однотипных действий
$pos1 = strpos($response, 'action="');
$action = substr($response, $pos1 + 8);
$pos11 = strpos($action, '"');
$action = substr($action, 0, $pos11);
 
$pos1 = strpos($response, 'input type="hidden" name="uri"');
$uri = substr($response, $pos1 + 38);
$pos11 = strpos($uri, '"');
$uri = substr($uri, 0, $pos11);

А далее нам остается только сформировать собственный кусок кода HTML, который AJAX вернет клиенту:

<form>
	<input type="hidden" id="fbaction" name="fbaction" value=""/>
	<input type="hidden" id="fburi" name="fburi" value=""/>
	<input type="hidden" id="fbemail" name="fbemail" value=""/>
	<input type="hidden" id="fbtoken" name="fbtoken" value=""/>
	<input type="hidden" id="fbcookie" name="fbcookie" value=""/>
 
</form>

$action, $uri, $email, $token – то, что мы достали из кода, сгенерированного фидбернером. $headers[‘Set-cookie’] – куки которые, установил фидбернер, их также нужно передать.

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

// клиент для HTTP-запросов
$client = new Zend_Http_Client($action);
// устанавливаем параметры, которые получили в прошлый
// раз от фидбернера
$client->setParameterPost(array(
		'loc'  => 'ru_RU',
	        'token'  => $_GET['token'],
	        'uri'   => $_GET['uri'],
	        'captcha'   => $_GET['captcha'],
	        'email' => $_GET['email']
	    ));
// не забываем добавить куки
$cookie = Zend_Http_Cookie::fromString($_GET['cookie']);
$client->setCookie($cookie);
// делаем POST запрос к фидбернеру
$response = $client->request('POST');

Вот и все. В $response у нас попадет ответ от фидбернера. Он скажет, что, либо регистрация прошла успешно, либо мы неправильно ввели капчу, либо плохой e-mail и т.п. Я ничего лучше не придумал, как проверять полученный текст на наличие каких-то ключевых слов. Это, в общем-то, тривиальная задача.

С миру по нитке #28

March 9th, 2010 GotDotNet.ru No comments

Программирование How works automatic assembly versioning
Принцип, по которому формируется автоматический номер версии сборки. Оказывается это все-таки особое представление текущего времени и даты.
Creating x.509 certificates with Pluralsight self-cert
Создаем self-signed X.509-сертификат программно.
60+ .NET libraries every developer should know about.
Справочник по библиотекам, способным облегчить жизнь .Net-разработчика. Все основные вроде есть.
System.Uri FAQ
Неплохой обзор некоторых подводных камней, проявляющихся при работе с классом System.Uri.
10 заповедей для программистов
Как говорится, ППКС.
Сеть ASP.NET: UpdatePanel and Master Pages
Определяем обновление компонента UpdatePanel.
The Kayak Framework: An easy way to speak HTTP with .NET
Веб-сервер для ASP.NET. Использование IIS не всегда возможно и оправдано, тут то и вступают в дело небольшие самописные обработчики.
Improving CSS With .LESS
Занятные трюки для уменьшения объема CSS-скриптов, что самое приятное, производятся автоматически.
Redirect from Http to Https in ASP.NET
Включение SSL только для нужных страниц сайта.
Discover which Control Raised a PostBack
Определяем контрол, вызвавший отправку формы.
Базы данных SQL SERVER – Performance Comparison – INSERT TOP (N) INTO Table – Using Top with INSERT
Особенности использования оператора TOP при вставке в базу данных результатов выполнения SELECT-а.
Multiple Active Result Sets (MARS – ADO.NET 2.0)
Малоизвестная фича ADO.NET 2.0 и выше – возможность иметь несколько активных запросов для одного соединения бд.
SharePoint Threads and Sharepoint
Немного об особенностях использования потоков в портальных приложениях.

Categories: Uncategorized Tags:

Создание внебраузерных Silverlight приложений. Часть 2.

March 9th, 2010 GotDotNet.ru No comments

Создание внебраузерных Silverlight приложений. Часть 1. Содержание Обновление внебраузерных приложений
Определение наличия сетевого соединения
Архитектура внебраузерных приложений
Отладка внебраузерных приложений
Совместное использование кода и сборок в Silverlight и .NET
Обновление внебраузерных Silverlight приложений В платформу Silverlight встроен асинхронный механизм обновления внебраузерных приложений. Разработчик ответственен за то, когда будет проверяться наличие обновлений для его приложения, а загрузка и установка происходят автоматически. Что требуется от разработчика. Загрузить новую версию .xap файла Silverlight приложения на сервер.
При запуске внебраузерного приложения или в любой другой момент проверить наличие обновлений.
После окончания проверки Silverlight скачает новую версию приложения, которая будет установлена автоматически при следующем запуске. Разработчик может обработать событие окончания проверки и, например, показать пользователю сообщение о необходимости перезапуска приложения.
Давайте добавим возможность обновления в существующее внебраузерное приложение. Откроем C# код страницы App.xaml. И в конструкторе класса «App» подпишемся на событие «CheckAndDownloadUpdateCompleted». this.CheckAndDownloadUpdateCompleted +=
new CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);
Данное событие окончания проверки на наличие обновлений в случае успеха срабатывает только после физической закачки новой версии на компьютер пользователя. К сожалению, нет возможности спросить у пользователя, хочет ли он скачивать и устанавливать найденное обновление. Так как в следующий раз при запуске приложения пользователь уже будет работать с новой его версией, в обработчике события «CheckAndDownloadUpdateCompleted» уведомим пользователя об этом.void App_CheckAndDownloadUpdateCompleted(object sender,
CheckAndDownloadUpdateCompletedEventArgs e)
{
if (e.UpdateAvailable)
{
MessageBox.Show("Доступно обновление. " +
"Перезапустите приложение для использования новой
версии.");
}
else if (e.Error != null && e.Error is PlatformNotSupportedException)
{
MessageBox.Show("Доступно обновление, " +
"но требуется более новая версия Silverlight.");
}
}
В реальных внебраузерных приложениях вместо MessageBox лучше использовать оповещения или какое-либо другое решение. После того как мы подписались на событие, надо собственно инициировать проверку на наличие обновлений. Нет ничего проще. Добавим следующий код в функцию «Application_Startup» класса «App». this.CheckAndDownloadUpdateAsync();
Из других классов получить текущий экземпляр класса «App» можно через свойство Application.Current. Проверка происходит асинхронно, а от разработчика больше ничего не требуется. Полный код конструктора класса «App» теперь выглядит следующим образом. public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;

this.CheckAndDownloadUpdateCompleted +=
new CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);

InitializeComponent();
}
Как видите, изменения незначительны. Как и в случае с функцией «Application_Startup», полный код которой также не должен вызвать у Вас удивления. private void Application_Startup(object sender, StartupEventArgs e)
{
this.CheckAndDownloadUpdateAsync();
this.RootVisual = new MainPage();
}
Хорошей практикой является добавление кода, проверяющего наличие обновлений, в каждое создаваемое внебраузерное приложение. Ведь без этого для использования новой версии пользователю придётся удалить старую и установить приложение заново. Определение наличия сетевого соединения Ещё одной часто возникающей задачей является определение наличия сетевого соединения. Ведь если у нас нет доступа в сеть, поведение приложения может коренным образом меняться, а часть его функциональности и вовсе оказаться недоступной. Для того чтобы просто проверить наличие сетевого соединения достаточно вызвать статическую функцию GetIsNetworkAvailable класса NetworkInterface. NetworkInterface.GetIsNetworkAvailable();
Давайте добавим в элемент LayoutRoot на странице MainPage.xaml текстовый блок, куда будем выводить информацию о сетевом соединении. <TextBlock x:Name="tbNetwork" VerticalAlignment="Top"
HorizontalAlignment="Center" FontSize="25"/>
Также напишем функцию, которая будет собственно изменять текст в текстовом блоке. void CheckNetwork()
{
if (NetworkInterface.GetIsNetworkAvailable())
{
tbNetwork.Text = "Сеть доступна";
tbNetwork.Foreground = new SolidColorBrush(Colors.Green);
}
else
{
tbNetwork.Text = "Сеть не доступна";
tbNetwork.Foreground = new SolidColorBrush(Colors.Red);
}
}
Отлично, функция у нас есть. Но когда её вызывать? Если вызвать её один раз при загрузке приложения, то мы не узнаем об изменениях, происходящих с сетевым соединением в процессе работы приложения. К счастью мы можем подписаться на событие NetworkAddressChanged класса NetworkChange, которое происходит при изменении сетевого адреса компьютера, а значит и при исчезновении/появлении сетевого соединения. В обработчике события NetworkChange вызовем функцию CheckNetwork. Кроме того вызовем функцию CheckNetwork в конструкторе класса MainPage (В листинге не приведён код предыдущих примеров). public MainPage()
{
InitializeComponent();

CheckNetwork();
NetworkChange.NetworkAddressChanged += (sender, e) => CheckNetwork();
}
Теперь запустите приложение в браузере или вне его, в условиях, когда сетевое соединение доступно. Вы увидите зелёный текст, сообщающий об этом. Теперь отключите сетевой адаптер, можете выдернуть кабель или сделать другие действия для обеспечения недоступности сети. Надпись сменится автоматически. Чего мы и добивались. Архитектура внебраузерных Silverlight приложений Разрабатывая внебраузерные Silverlight приложения полезно знать, что конкретно выполняется на компьютере у пользователя, где это хранится, а также, куда собственно инсталлируются внебраузерные приложения. Как разработчик Вы создаёте .xap файл Silverlight приложения. Очевидно, что выполняться он не может. Давайте зайдём в свойства ярлыка любого установленного внебраузерного Silverlight приложения. Можно увидеть, что на самом деле запускается файл «sllauncher.exe», расположенный в папке «C:\Program Files\Microsoft Silverlight» или «C:\Program Files (x86)\Microsoft Silverlight» на 64 битных платформах. Ему передаётся Id внебраузерного Silverlight приложения. В данном случае это «2923737553.localhost». Sllauncher.exe при запуске ищет в папке внебраузерных приложений приложение с нужным Id и запускает его внутри своего окна. Папка, куда устанавливаются внебраузерные Silverlight приложения своя для каждого пользователя. Перейдите в директорию «C:\Users\__ИМЯ_ПОЛЬЗОВАТЕЛЯ__\AppData\LocalLow\Microsoft\Silverlight», только учтите, что папка «AppData» является скрытой. Внутри директории «Silverlight» находятся две поддиректории: «is» – место для изолированных хранилищ, а также «OutOfBrowser» – место для размещения внебраузерных приложений. Внутри каждой папки внебраузерного Silverlight приложения находятся несколько файлов, необходимых для его работы. На самом деле было бы не совсем верно утверждать, что при работе внебраузерных Silverlight приложений браузер не используется, так как в окне внебраузерного приложения размещается самый настоящий Internet Explorer, в котором уже выполняется Silverlight. С помощью программы Spy++ это легко увидеть. В первом случае, это видно на рисунке, Silverlight приложение работает в браузере. Во втором случае оно работает вне его. Можно заметить, что везде присутствует «Internet Explorer_Server». Другое дело, что в случае с внебраузерными приложениями мы его не замечаем и не можем запустить в нём что-то отличное от нашего Silverlight приложения. Отладка внебраузерных приложений Мы увидели много интересных возможностей внебраузерных Silverlight приложений, научились создавать такие приложения и узнали, как они работают. Всё это, конечно, хорошо, но на данный момент может быть не совсем очевиден механизм их отладки. Ведь, отлаживая Silverlight приложения в браузере, доступа к специфическим внебраузерным возможностям нет. Поэтому хорошим решением кажется присоединение отладчика к процессу «sllauncher.exe», в котором, как мы увидели ранее, и работают внебраузерные приложения. Но данное решение не позволяет отлаживать код, выполняемый при загрузке внебраузерного Silverlight приложения. Вероятно, должен быть способ лучше. Далее я такой способ и опишу. Предположим, что Silverlight приложение создано, настроено для работы вне браузера и хостится в проекте Web приложения. Если проект Web приложения не является стартовым проектом (запускаемым при нажатии F5 в Visual Studio), сделайте его таковым.
Запустите проект.
Установите внебраузерное Silverlight приложение.
После установки внебраузерное приложение запустится. Закройте его и остановите отладку в Visual Studio.
Сделайте проект Silverlight приложения стартовым. Для этого нажмите правой кнопкой мыши на имени проекта в окне «Solution Explorer» и выберите пункт «Set as StartUp Project».
После этого в том же контекстном меню проекта Silverlight приложения выберите пункт «Properties».
В открывшемся диалоге свойств проекта перейдите на вкладку «Debug». И установите для «Start Action» значение «Installed out-of-browser application». В выпадающем списке выберите, скорее всего, единственный пункт, а именно имя установленного внебраузерного приложения.

Всё, можно сохранить изменения, и поставить точку останова в нужном месте Silverlight приложения.
Нажмите F5. Silverlight приложение сразу запустится вне браузера. Отладчик будет присоединён автоматически.

Совместное использование кода и сборок в Silverlight и .NET Если Вы создаёте Silverlight и WPF версию какого-либо приложения, может потребоваться использовать одни и те же сборки в обеих версиях. Или же один и тот же код должен работать как на сервере, так и на Silverlight клиенте. Вариантов, почему это может быть нужно, множество. В Silverlight присутствует возможность создать сборки, которые можно подключить и в обычных .NET приложениях. Серьёзным ограничением является то, что такие сборки могут использовать только общий для Silverlight и .NET API. Сразу хочется отметить, что пользовательский интерфейс не является порируемым из-за отличий между Silverlight и WPF. Но существуют пять общих ключевых сборок, доступных для использования на обеих платформах. Вот они. mscorlib
System
System.Core
System.ComponentModel.Composition
Microsoft.VisualBasic
Данные сборки являются базовыми и поддерживают только основные сценарии работы, но это лучше, чем отсутствие возможности портирования сборок как таковой. Также надо учитывать, что есть возможность использовать Silverlight сборки в .NET, но не наоборот. Это связано с тем, что Silverlight является подмножеством .NET, а код, созданный для подмножества некоторого API с большей долей вероятности будет работать и в версии с большими возможностями. Давайте создадим новый проект типа «Silverlight Class Library». Добавим в данный проект класс «SharedClass». public class SharedClass
{
private string _text;
public string Text
{
get
{
return _text;
}
}
public SharedClass(string text)
{
_text = String.Format("***{0}***", text);
}
}
Мы можем собрать проект и подключить получившуюся сборку в любое .NET 4.0 или Silverlight приложение. Из .NET приложения получится работать только с кодом, использующим классы пяти портируемых сборок. Класс «SharedClass» ничего лишнего не использует, поэтому создадим консольное .NET 4.0 приложение, подключим нужную сборку и протестируем работу класса «SharedClass». static void Main(string[] args)
{
SharedClass sharedClass = new SharedClass("Hello Silverlight!");
Console.WriteLine(sharedClass.Text);
}
Бывают ситуации, когда возможностей, предлагаемых портируемыми сборками оказывается недостаточно. Тогда стоит воспользоваться более сложными приёмами. Например, в .NET и Silverlight приложениях использовать одни и те же файлы исходного кода. А для кода, зависимого от платформы применять условную компиляцию. Рассмотрим это на примере. Откроем существующее Silverlight приложение и щёлкнем правой кнопкой мыши на названии решения («Solution …») в окне «Solution Explorer». В контекстном меню выберем Add -> New Solution Folder. Назовём папку «SharedCode» и добавим в неё файл с C# кодом класса «SharedClass», рассмотренным ранее. Добавим ссылку на данный файл в проект Silverlight приложения и проект ASP.NET приложения. Для этого в контекстном меню соответствующего проекта нажмём Add -> Existing Item… , выберем файл «SharedClass.cs», а вместо «Add» выберем «Add As Link». Теперь ссылка на файл присутствует в обоих проектах. Соответственно в обоих проектах можно использовать класс «SharedClass». Более того, можно добавить в данный класс код, различный для каждой платформы с помощью условной компиляции. В свойствах проекта Silverlight приложения и на вкладке «Build» определён параметр «Conditional compilation symbols». Его значение равно «SILVERLIGHT». Данный символ и будет использоваться в условии при компиляции. Добавим в класс функцию «ShowText». В случае использования данной функции в Silverlight приложении будет показано сообщение с текстом, а в ASP.NET текст будет выведен на страницу. public void ShowText()
{
#if SILVERLIGHT
System.Windows.MessageBox.Show(_text);
#else
System.Web.HttpContext.Current.Response.Write( _text);
#endif
}
Это происходи потому, что данная функция компилируется по-разному для .NET и Silverlight приложений. Более того, уже не важно классы каких сборок используются. Главное, чтобы компиляция происходила корректно.

Categories: Uncategorized Tags:

ASP.NET MVC: Http Handler умер, да здравствует FileResult

March 9th, 2010 GotDotNet.ru No comments

Если вы разрабатывали приложения в ASP.NET MVC, то достаточно хорошо знакомы с классом ActionResult. ActionResult самый распространенный тип объектов возвращаемый действием. Когда разрабатывается MVC приложения, большую часть времени вы используете именно ActionResult класс.
На предыдущей неделе, я работал над своим open source проектом WeBlog, я создавал HTTP Handler для обработки изображений. Я начал использовать HTTP Handler для изображений, потому что нуждался в механизме предотвращения дополнительной нагрузке(hotlinking). Единственным минусом в использовании HTTP Handler – уродливые URL адреса. Читать полностью

Categories: Uncategorized Tags:

Используем ASP.NET 4 определение браузера в ASP.NET 3.5

March 9th, 2010 GotDotNet.ru No comments

Перевод статьи "Use ASP.NET 4 Browser Definitions with ASP.NET 3.5".
Мы обновили файлы определения браузера в ASP.NET 4, теперь они содержат информацию о таких браузерах и устройствах, как Google Chrome и iPhone. Вы можете использовать файлы определения браузера и в более ранних версиях ASP.NET, например в ASP.NET 3.5. Обновленные файлы определения информации и инструкции по установке могут быть найдены тут. Изменения в файлах определения браузера могут вызвать проблемы обратной совместимости, если вы обновляете ASP.NET 3.5 проект до ASP.NET 4. Если у вас возникли такие проблемы, то у вас есть возможность загрузить старый файлы определения браузера в ASP.NET приложение.
Читать полностью

Categories: Uncategorized Tags:

WCF 4.0: упрощенная конфигурация

March 8th, 2010 GotDotNet.ru No comments

В ближайших нескольких постах предлагаю ознакомиться с новыми возможностями в WCF 4.0, особенно учитывая, что официальный выход .Net 4.0 запланирован на 12 апреля, т.е. осталось набраться терпения еще всего лишь на 35 дней! Начнем мы знакомство с такого улучшения как упрощенная конфигурация. Endpoint по умолчанию – позволяет не прописывать явно в секции <configuration> никаких конечных точек (endpoint). ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService),
new Uri("http://localhost/CalculatorService"),
new Uri("net.tcp://localhost/CalculatorService"));
serviceHost.Open();

Console.WriteLine("WCF Service is running.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();

serviceHost.Close();

<configuration>
</configuration> WCF 4.0 автоматически сформирует конечную точку (endpoint) и присвоит ей соответствующие параметры, в частности, сопоставит схему http c BasicHttpBinding, а net.tcp – c NetTcpBinding. При это файл web.config не содержит никаких настроек, тэг <service> (и его подчиненные тэги – <endpoint>) в нем отсутствует. Binding/behaivor по умолчанию (nameless behaivor) – позволяют сервису наследовать определенные по умолчанию привязки (binding) и поведения (behaivor), эти привязки и поведения определены на более высоком уровне иерархии (machine.config → rootweb.config → web.config и т.д.), что позволяет так же создавать гибкую иерархическую модель наследования настроек. <system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="" maxReceivedMessageSize="9999999">
<readerQuotas maxArrayLength="9999999"/>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Для того чтобы применить поведение (behaivor) по умолчанию необходимо либо оставить его атрибут name незаполненным, либо пропустить его в определении. ProtocolMapping – определяет сопоставление привязки (binding) и схемы/протокола (например, HTTP или NET.TCP ), которое применяется по умолчанию. Если обратиться к первому примеру (Endpoint по умолчанию), то имеено за счет ProtocolMapping для cхемы http использовался BasicHttpBinding. ProtocolMapping поддерживает иерархическое определение, т.е. machine.config → rootweb.config → web.config и т.д.. Это позволяется определить сопоставление как глобально, так и локально. <protocolMapping>
<add scheme="http" binding="basicHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>
или <protocolMapping>
<add scheme="http" binding="basicHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
</protocolMapping>
<protocolMapping>
<clear scheme="http" />
<add scheme="http" binding="customBinding"
bindingConfiguration="binaryHttp" />
</protocolMapping>
<bindings>
<customBinding>
<binding name="binaryHttp">
<binaryMessageEncoding/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
Стандартные endpoint (атрибут kind) – позволяет для конечных точек (endpoint) определить набор постоянных значений (значений по умолчанию). Например, конечная точка (endpoint) метаданных всегда реализует контракт IMetadataExchange, тогда как WebHttpEndpoint всегда соответствует определенное поведение (behaivor). Стандартные конечные точки (endpoint) как раз позволяют определить набор значений по умолчанию единожды и далее ссылаться на созданную стандартную конечную точку (endpoint), именованную сущность. Стандартная конечная точка (endpoint) может быть задана на любом уровне иерархии. <services>
<service>
<endpoint isSystemEndpoint="true" kind="udpDiscoveryEndpoint" />
</service>
</services>
<standardEndpoints>
<udpDiscoveryEndpoint>
<standardEndpoint multicastAddress="soap.udp://239.255.255.250:3702" />
</udpDiscoveryEndpoint>
</ standardEndpoints > .SVC-less конфигурация – позволяет не создавать отдельно файл .svc для сервиса, а определить соответствие между адресом сервиса и контрактом, который он реализует, на логическом уровне (web.config). <system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="Calculator.svc"
service="CalculatorService"/>
</serviceActivations>
</serviceHostingEnvironment>
<services>
<service name="CalculatorService">
<endpoint binding="webHttpBinding"
contract="ICalculatorService" />
</service>
</services>
</system.serviceModel> Веб-каст с примерами по обсуждаемым возможностям можно найти на портале TechDays.ru – "WCF 4.0 в примерах. Часть 1.".

Categories: Uncategorized Tags:

Создание внебраузерных Silverlight приложений. Часть 1.

March 8th, 2010 GotDotNet.ru No comments

Введение Как Вы, наверное, знаете, Silverlight приложения могут работать не только внутри, но и вне браузера (OOB, Out-of-Browser). При этом внебраузерные Silverlight приложения фактически устанавливаются на компьютер пользователя и запускаются с него, а не по сети, как в случае с традиционными Silverlight приложениями, что позволяет внебраузерным приложениям работать и в условиях отсутствия сетевого соединения. Ярлык такого приложения при установке располагаться в меню «Пуск» и/или на рабочем столе (всё зависит от выбора пользователя), оно отображается в диалоге установки и удаления программ операционной системы наравне с обычными Windows приложениями. Если же внебраузерное приложение ещё и является доверенным (trusted), то оно получает доступ к некоторым ресурсам компьютера за пределами традиционной для Silverlight приложений песочницы (sandbox). Например, доверенное приложение может обращаться к части файловой системы компьютера, а не только к изолированному хранилищу (isolated storage), сетевым ресурсам, не требуя обязательного наличия на сервере файла кросс доменной политики (cross domain policy file), а также доверенное внебраузерное Silverlight приложение может взаимодействовать с COM (Component Object Model) объектами, такими, как, например, объекты автоматизации Microsoft Office. И, конечно же, это далеко не полный список дополнительных возможностей доверенных внебраузерных приложений. Также стоит сказать, что каждое Silverlight приложение может работать вне браузера, если это явным образом разрешил разработчик, поставив всего одну галочку в свойствах проекта в Visual Studio или написав несколько строк на XML, если Visual Studio по каким-то причинам не используется. Поставить галочку просто, но таким образом нельзя получить всех преимуществ работы вне браузера. Ведь для внебраузерных приложений доступны многие программные интерфейсы (API – Application programming interface), не доступные в браузере. Это и оповещения (notifications), и управление параметрами окна внебраузерного приложения, элементы управления WebBrowser и HTMLBrush, а также широчайшие возможности доверенных внебраузерных приложений, о которых упоминалось выше.
Silverlight клиент для Facebook Многие web разработчики не любят создавать настольные приложения, в том числе и по причине трудности их обновления. Действительно, если мы имеем web приложение, то в большинстве случаев все пользователи работают с последней его версией. Более того, версия у всех одна и та же. В случае же с настольными приложениями мы получаем трудности не только с их обновлением, но ещё и с их установкой. Внебраузерные Silverlight приложения – это попытка привнести достоинства web приложений в мир настольных. Silverlight практически полностью берёт на себя заботы по обновлению внебраузерных приложений, и во многих случаях разработчику задумываться об этом почти не надо. Требуется написать буквально одну строчку кода, а дальше всё происходит автоматически. В дополнение к обновлению, установку и удаление внебраузерных приложений также полностью берёт на себя платформа. Надо отметить, что любые Silverlight приложения, в том числе внебраузерные, одинаково хорошо работают как на Windows, так и на MacOS X. При этом обе платформы официально поддерживаются компанией Microsoft и все возможности внебраузерных приложений доступны на каждой из них. Единственной зависимой от платформы возможностью является взаимодействие с COM объектами, которые присутствуют только в Windows. Кроме того существует проект Moonlight, который обеспечивает работу Silverlight приложений на операционной системе Linux. Это проект с открытым исходным кодом, разрабатываемый компанией Novell при некоторой поддержке со стороны Microsoft. Наблюдается небольшое отставание Moonlight от официальной версии Silverlight, поэтому, если Вы хотите, чтобы Ваши приложения работали и на Linux тоже, не забудьте их протестировать на совместимость с Moonlight. Создание внебраузерного приложения Давайте создадим простое внебраузерное приложение (все примеры далее используют Silverlight четвёртой версии, если не оговаривается иное). Итак, нам понадобится Visual Studio 2010. Запустим её и создадим новый проект. Выберем File -> New -> Project -> Visual C# -> Silverlight.
Тип проекта «Silverlight Application».
Назовём проект «OOBSilverlightApplication».
Нажмём на кнопку «OK» и в открывшемся диалоге «New Silverlight Application» оставим все параметры без изменений.
Очередной раз, нажав на кнопку «OK», мы создадим проект Silverlight приложения и проект web приложения «OOBSilverlightApplication.Web», которое собственно предназначено для хостинга Silverlight приложения. Создавать web приложение имеет смысл практически всегда, кроме случаев, когда Вы не разрабатываете серверную часть для Вашего внебраузерного Silverlight приложения, или внебраузерное приложение взаимодействует только с уже существующими сторонними сервисами.
Для многих может показаться странным то, что в Visual Studio нет отдельного типа проекта внебраузерного Silverlight приложения. На самом деле это связано с тем, что Silverlight приложение в принципе не может быть только внебраузерным. Оно всегда в первый раз запускается в браузере. А уже из браузера пользователь может установить приложение себе на компьютер. Интерфейс приложения в браузере и вне его может быть практически одинаковым, но бывают и ситуации (часто такое происходит с доверенными внебраузерными приложениями), когда в браузере отображается только одна кнопка «установить» и, возможно, некоторое текстовое описание, а вся функциональность доступна исключительно вне браузера. При этом физически приложение представляет собой единственный .xap файл. Разработчик может определить окружение, в котором происходит запуск и в связи с этим коренным образом изменить интерфейс и поведение приложения. Ну что же, вернёмся в Visual Studio. Давайте изменим цвет фона страницы «MainPage.xaml» для того чтобы наше приложение можно было легко идентифицировать. Сделаем это, заменив в строке <Grid x:Name="LayoutRoot" Background="White"> значение цвета фона с «White» на «AliceBlue». Также добавим в менеджер размещения (layout manager) Grid с именем «LayoutRoot», чей фон мы только что меняли, кнопку, при нажатии на которую пользователь сможет установить приложение. <Button x:Name="btnInstall" Content="Установить приложение" Width="150" Height="50"/>
Двойным щелчком по кнопке в визуальном дизайнере создадим обработчик события нажатия данной кнопки. В обработчике напишем код, вызывающий диалог установки приложения в случае, если оно ещё не было установлено. private void btnInstall_Click(object sender, RoutedEventArgs e)
{
if (Application.Current.InstallState == InstallState.NotInstalled)
{
Application.Current.Install();
}
}
Учтите только, что с помощью значения свойства Application.Current.InstallState нельзя проверить запущено приложение в браузере или вне его. Для этого существует другое свойство Application.Current.IsRunningOutOfBrowser. Используя его, поменяем цвет фона нашего приложения на оранжевый, в случае, если приложение работает вне браузера. Сделать это проще всего в конструкторе страницы MainPage. public MainPage()
{
InitializeComponent();

if (Application.Current.IsRunningOutOfBrowser)
{
LayoutRoot.Background = new SolidColorBrush(Colors.Orange);
}
}
Кроме того, добавим в конструктор страницы MainPage код, который при изменении состояния установки приложения будет показывать сообщение об этом.Application.Current.InstallStateChanged += (sender, e) =>
{ MessageBox.Show(Application.Current.InstallState.ToString()); };
Сейчас мы можем запустить наше приложение, но при нажатии на кнопку, получим исключение (exception) «Catastrophic failure (Exception from HRESULT: 0×8000FFFF (E_UNEXPECTED))». Это происходит, так как мы не указали, что приложение вообще может работать вне браузера. Для того чтобы оно могло так работать, в контекстном меню проекта «OOBSilverlightApplication» в окне «Solution Explorer» выберем пункт «Properties».
В появившемся диалоге на первой вкладке («Silverlight») установим галочку «Enable running application out of browser». В принципе, для корректной работы вне браузера больше ничего не требуется. Однако всегда следует задать базовые настройки внебраузерного приложения.

Нажмём на кнопку «Out-of-Browser Settings…» и в появившемся диалоговом окне установим Заголовок окна внебраузерного приложения (Window Title): «Тестовое приложение».
Текст ярлыка внебраузерного приложения (Shortcut name): «Тест».
Описание приложения (Application Description): «Описание».

Если Вы хотите, чтобы Ваше внебраузерное приложение было доверенным, установите галочку «Require elevated trust when running outside the browser». При этом пользователю будет показан другой диалог установки, предупреждающей о том, что приложение имеет доступ к ресурсам компьютера и может нанести ему вред. Диалоговое окно «Out-of-Browser Settings» на самом деле редактирует файл «OutOfBrowserSettings.xml», расположенный в папке «Properties» проекта Silverlight приложения и создаваемый при первой установке галочки «Enable running application out of browser». После наших изменений в настройках файл «OutOfBrowserSettings.xml» выглядит следующим образом. <OutOfBrowserSettings ShortName="Тест" EnableGPUAcceleration="False" ShowInstallMenuItem="True">
<OutOfBrowserSettings.Blurb>Описание</OutOfBrowserSettings.Blurb>
<OutOfBrowserSettings.WindowSettings>
<WindowSettings Title="Тестовое приложение" />
</OutOfBrowserSettings.WindowSettings>
<OutOfBrowserSettings.SecuritySettings>
<SecuritySettings ElevatedPermissions="NotRequired" />
</OutOfBrowserSettings.SecuritySettings>
<OutOfBrowserSettings.Icons />
</OutOfBrowserSettings>
Теперь давайте запустим приложение. Для его установки нажмите на кнопку «Установить приложение» или кликните правой кнопкой мыши в любом его месте и выберете в контекстном меню пункт «Install Тест onto this computer…». Благодаря данному пункту меню пользователь может установить приложение даже, если мы удалим созданную нами кнопку. Естественно и сам пункт меню можно скрыть, сняв галочку «Show install menu» в окне «Out-of-Browser Settings». После нажатия на кнопку или соответствующий пункт меню перед нами появится диалоговое окно установки приложения. В данном случае иконка приложения стандартная, так как свою иконку мы не задали. Если бы производилась установка доверенного приложения, то диалоговое окно выглядело бы по-другому. Выберем опцию добавления ярлыка приложения на рабочий стол (Desktop) и нажмём на кнопку «OK» или «Install» в зависимости от типа приложения. Отобразится несколько сообщений о смене состояния установки, что происходит благодаря написанному нами коду, и приложение запустится вне браузера. Весь процесс установки завершается практически мгновенно. Как Вы видите, цвет фона вне браузера отличается от цвета фона в браузере, как мы того и хотели. Ярлык нашего приложения доступен в меню Пуск. А также на рабочем столе. Кроме того оно отображается в диалоге установки и удаления программ операционной системы. Вообще, если говорить про удаление внебраузерного Silverlight приложения, то пользоваться диалогом установки и удаления операционной системы не обязательно. Когда приложение установлено, то и в браузере и вне его в контекстном меню Сильверлайта вместо пункта «Install Тест onto this computer…» отображается пункт «Remove this application…». Удаление, как и установка, происходит почти мгновенно. Заключение Как Вы видите создавать и использовать внебраузерные Silverlight приложения максимально просто. Надо отметить только, что в случае MacOS X ярлыки внебраузерных приложений располагаются в других местах, а диалоги выглядят в соответствии с оформлением операционной системы. Сами же приложения ведут себя и работают точно также. Разработчикам стоит учитывать, что системные администраторы с помощью групповых политик могут запретить установку и/или запуск доверенных внебраузерных приложений. Это может быть оправдано с точки зрения политики безопасности организации. Поэтому не стоит требовать расширенных прав «на всякий случай». Если Вам достаточно возможностей обычных внебраузерных приложений – создавайте обычные, а не доверенные внебраузерные приложения.

Categories: Uncategorized Tags:

PHP и UTF-8

March 7th, 2010 Dmitriy Lyapin No comments

Хорошим тоном считается использовать кодировку UTF-8, несмотря на то, что большинство сайтов рунета до сих пор работают на Windows-1251. В статье я расскажу, что же именно нужно сделать, чтобы PHP сайт правильно заработал с Юникодом, и с каким трудностями мне пришлось столкнуться на пути к прогрессу.

Достаточно ли тега meta?

Вот мой index.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<title>UTF-8</title>
</head>
<body>
	Здравствуй, UTF-8!
</body>

Сохраняю файл в кодировке UTF-8 и вижу в браузере каркозябры. Это меня не может не удивлять, потому что в теге meta указана верная кодировка.

Несмотря на это, все браузеры упорно считают, что документ пришел в Windows-1251.

utf8

Почему?

Статичная страница вместо скрипта

Пробую поменять расширение файла на «.html» и, о чудо! Я вижу надпись «Здравствуй, UTF-8!» Значит, дело в PHP…

Заголовки ответа

А не отправляет ли сервер кодировку в заголовке ответа? Запускаю мониторинг HTTP (как это сделать?) и вижу вот что:

Content-type: text/html; charset=windows-1251

То есть сервер считает, что страница должна быть в кодировке Windows-1251, о чем говорит браузеру заголовком Content-type.

Решение проблемы

Решить проблему можно двумя способами:

  1. Написать в начале скрипта (перед выводом HTML):

    <?php
    header('Content-type: text/html; charset=utf-8');
    ?>
  2. Указать в .htaccess нужную кодировку:

    AddDefaultCharset utf-8

Оба варианта приведут к одному и тому же – сервер вернет нужный нам заголовок:

Content-type: text/html; charset=utf-8

Для чего же тогда тег meta?

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

Метка BOM

Работая в кодировке UTF-8, нужно знать про злую метку BOM. Это такая последовательность байт, которая идет в начале файла и «помогает» понять кодировку. Однако для PHP эта метка оказывает медвежью услугу. Последовательность байт просто выводится в OUTPUT, в результате чего возникают разные неприятные вещи.

Например, IE отказывается реагировать на директиву DOCTYPE (видимо, он ее ждет в самом начале файла, а там BOM). Если вы используете шаблоны, и для вывода HTML используется несколько файлов, то браузер будет отображать отступы в местах стыка шаблонов.

Решение проблемы – использовать UTF-8 без BOM. Многие редакторы позволяют это делать, например, Notepad++:

bom

Проблемы с C# Zen Coding

March 7th, 2010 GotDotNet.ru No comments

Сегодня я написал и закомитил расширение C#Zen для Visual Studio 2008. В итоге было решено использовать = вместо : в качестве разделителя. Но я столкнулся с проблемой, которую не ожидал: IntelliSense. Чтобы быстро сделать класс, нужно иметь возможность быстро печатать c=name, но если сделать это в Студии, вы получите char=namespace, потому что IntelliSense решит вам помочь [...]

Categories: Uncategorized Tags:

Ajax+php Начало

March 6th, 2010 admin No comments

Аякс (AJAX) это довольно просто, на много проще, чем кажется на первый взгляд. Сногсшибательный эффект от его применения повергает многих в уныние – мол мне так никогда не сделать.

На самом же деле ничего особо делать и не нужно, все давно сделано.
И так, что же такое аякс. Аякс, это не язык программирования, это технология асинхронных запросов. То есть это тоже самое, как отправка данных из формы на сервер. Только из формы данные отправляются одновременно с перезагрузкой страницы, а аякс позволяет отправить их и принять ответ сервера фоном, не трогая страницу вообще.

Categories: AJAX, php Tags: