четверг, 30 сентября 2010 г.

MEX endpoint и ошибка 400

Пусть есть некоторая WCF служба, у которой определен MEX endpoint:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="GeneralBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="WcfTest.Core.TalkingService" behaviorConfiguration="GeneralBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="WcfTest.Core.ITalkingService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>

</configuration>

Служба хостится в IIS по адресу http://localhost/WcfTest.IISHost/TalkingService.svc. Заходим браузером на этот адрес и видим сообщение, поясняющее, что мы можем сделать с этой службой. В сообщение предлагается получить WSDL, перейдя по ссылке http://localhost/WcfTest.IISHost/TalkingService.svc?wsdl. Это работает, именно для этого был использован httpGetEnabled.

Однако при попытке перейти по адресу http://localhost/WcfTest.IISHost/TalkingService.svc/mex, указанному в MEX endpoint, мы получим от сервера ошибку HTTP 400 Bad request. Почему, мы же разрешили MEX? Плюс WCFTestClient нормально работает с этим адресом.

Дело в том, что mexHttpBinding использует SOAP и ожидает POST запрос, поэтому к нему нельзя обратиться через браузер. Единственный способ получить браузером WSDL - использовать параметр ?wsdl.

Найдено здесь и здесь.

вторник, 21 сентября 2010 г.

Использование WSE в Windows 7 x64

WSE поддерживается только 2005 студией. Установщик WSE терпит неудачу при обновлении конфига студии, в результате чего она неверно генерирует прокси-классы. Для решения этой проблемы необходимо добавить в файл C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE\devenv.exe.config следующий код:

<configuration>
  <system.web>
    <webServices>
      <soapExtensionImporterTypes>
        <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </soapExtensionImporterTypes>
    </webServices>
  </system.web>
</configuration>

Найдено здесь.

среда, 15 сентября 2010 г.

Установка boost под Windows

Второй пост из серии «Простой проект с использованием CMake, log4cxx, boost». Рассмотрим установку библиотек boost под Windows.

Существует два способа:
  1. собрать из исходников
  2. использовать инсталлятор

Выберем второй, как более простой. Boost Installer находится здесь, последняя на данный момент версия 1.44.0. Для работы установщика необходимо соединение с Интернет.

После запуска и принятия лицензии будет предложено выбрать зеркало, следует оставить значение по умолчанию (Nearest SourceForge Mirror). Затем требуется указать варианты конфигурации бинарников.


Данное окно позволяет выбрать вариант установки библиотеки. Например, если выбрать Visual C++ 2010, Multithread Debug DLL, то будут загружены все компоненты boost'а, собранные под 10-ую студию в динамически загружаемую библиотеку с отладочной информацией. Нам все компоненты не нужны, поэтому никаких галочек здесь не ставим, вместо этого выбираем отдельные компоненты.


Для текущего проекта понадобится Boost Filesystem, Boost System и все заголовочные файлы. Выбираем варианты Multithread Debug DLL и Multithread DLL под vs10.0. В PATH (Add to path чекбокс) ничего добавлять не нужно. Destination Folder оставляем по умолчанию. Затем следует процесс скачивания выбранных компонентов. Если возникают проблемы с доступностью серверов и соединение рвется, следует перезапустить установщик с теми же параметрами.

На вопрос об обновлении PATH отвечаем отрицательно, это действие выполним вручную. Поскольку мы будем линковаться с динамически загружаемыми библиотеками, они должны быть доступны нашей программе при запуске. Для этого в PATH добавляем C:\Program Files\boost\boost_1_44\lib, т.е. папку с бинарными файлами boost'а.

На этом установку можно считать законченной.

ReSharper: имена обработчиков событий UI

По умолчанию VS генерирует имена методов, подписанных на события UI, по шаблону
объект_событие, однако решарпер подчеркивает эти имена как имеющие неверный стиль. Для исправления открываем его настройки (ReSharper --> Options) и на странице Languages --> C# --> C# Naming Style выбираем опцию Override Common Settings. В таблице выделяем Methods, Properties and Events и нажимаем Advanced Settings. В поле Event subscriptions on fields вместо $object$_On$event$ пишем $object$_$event$.



Взято здесь.

вторник, 7 сентября 2010 г.

MS SQL CE 3.5: Список файлов

Полезная статья, содержащая списки бинарных файлов MS SQL CE 3.5 для разных сценариев частного развертывания.

четверг, 2 сентября 2010 г.

Bash: как сделать trim()?

Q: Как сделать trim() в bash?


A:
~$ echo " test" | tr -d " "

Linux: изменить локаль запускаемого приложения

Q: Как запустить некоторое приложение так, чтобы вместо локали по умолчанию, например, русской, использовалась английская?


A:
~$ LANG=C command

Сборка log4cxx 0.10.0 в Visual Studio 2010. Детали

Первый пост из серии «Простой проект с использованием CMake, log4cxx, boost». Рассмотрим сборку log4cxx из исходников под Windows с использованием Visual Studio 2010. Соответствующий пост с отдельными деталями здесь.

log4cxx — библиотека от Apache, предназначенная для организации логирования в проектах на C++. Создается впечатление, что разработка заглохла, но библиотека довольно фичаста, плюс семейство библиотек log4-что-то является одним из стандартов в своей области. Поэтому будет использовать ее, хотя стоит обратить внимание и на Boost.Log, и на google-glog.

В качестве базы использована официальная инструкция по сборке. Начнем со скачивания исходников. Необходима сама библиотека (apache-log4cxx-0.10.0.zip) и две вспомогательных для нее: Apache Portable Runtime (apr) и APR-util (там же). Последние версии на момент написания статьи 0.10.0, 1.4.2 и 1.3.9 соответственно. На странице с библиотеками нужно скачивать версии Win32 Source, чтобы использовались правильные символы конца строки.

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

После этого необходимо запустить два bat-файла из папки apache-log4cxx-0.10.0, configure.bat и configure-aprutil.bat. Можно использовать проводник, но я предпочитаю консоль. Второй батник использует sed, который должен быть доступен в $PATH. Скачать его можно здесь. Подробности установки sed рассматривать не будем, если нужно, можно задать вопрос в комментарии.

Итак, запускаем батники:

После этого необходимо пропатчить исходники, чтобы они собирались 2010-ой студией. Заходим в Jira проекта и скачиваем прикрепленный к талону патч. Для его применения можно использовать TortoiseSVN: щелкаем по файлу правой кнопкой и выбираем пункт TortoiseSVN --> Apply patch. Черепаха спросит, к файлам из какой папки должен быть применен этот патч. Укажем папку, куда были распакованы архивы. После этого в маленьком окошке со списком файлов выберем все cpp-файлы и все h-файлы кроме log4cxx.h и log4cxx_private.h


Щелкаем по ним правой кнопкой и выбираем пункт Patch Selected. Применение изменений должно пройти без ошибок, никакой файл из приведенных в списке не должен стать красным.

После применения патча запускаем VS и открываем в ней apache-log4cxx-0.10.0\projects\log4cxx.dsw. Соглашаемся со всеми предложениями, связанными с конвертацией в проект нового формата. Во время этого процесса студия потеряет данные о зависимости log4cxx.dll от других вспомогательных библиотек, поэтому проект соберется, но не слинкуется. Восстановим зависимости, как указано в другом посте, упомянутом выше.

В Solution Explorer'е выбираем проект log4cxx и открываем его свойства. Открываем страницу свойств Configuration Properties --> Linker --> General и для конфигурации Debug в пункте Additional Library Directories указываем следующее, говоря тем самым линковщику, где искать дополнительные библиотеки:
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD



Затем необходимо указать с какими именно дополнительными библиотеками нужно осуществлять линковку. Для этого в том же окне на странице Configuration Properties --> Linker --> Input выбираем пункт Additional Library Dependencies. Там указываем дополнительные библиотеки к уже имеющимся:
apr-1.lib
aprutil-1.lib
xml.lib

Для конфигурации Relese нужно сделать все тоже самое, с тем лишь исключением, что вместо папки LibD нужно будет указывать LibR. Сохраняем изменения и запускаем компиляцию, щелкнув по проекту log4cxx правой кнопкой и выбрав пункт Build.

После компиляции в папках apache-log4cxx-0.10.0\projects\Debug и apache-log4cxx-0.10.0\projects\Release появятся бинарные файлы. Нас интересует log4cxx.dll и log4cxx.lib, позже будем ссылаться на них как на дебажные и релизные версии log4cxx.

Update: VS 2010 на XP почему-то может не собрать проект, ссылаясь на ошибку, связанную с mt.exe. Помогает сборка по частям: aprutil, xml, apr и log4cxx.

Простой проект с использованием CMake, log4cxx, boost

Планируется серия постов, посвященных разработке простого проекта на C++, использующего библиотеки boost, log4cxx, и собираемого CMake. Будет рассмотрена интеграция с Visual Studio 2010 и Eclipse Helios CDT, соответственно проект будет собираться под Windows и Linux. Отдельные детали уже были описаны в предыдущих постах, сейчас же рассмотрим все в подробностях.

Примерный план такой:

  1. Сборка log4cxx под Windows

  2. Установка boost под Windows
  3. Разработка структуры проекта
  4. Написание кода
  5. Конфигурация log4cxx
  6. Сборка CMake'ом под Windows
  7. Интеграция с Visual Studio 2010
  8. Установка библиотек и сборка CMake'ом под Linux
  9. Интеграция с Eclipse Helios CDT
Больше внимания будет уделено Windows, поскольку для нее все оказалось сложнее и не так прямолинейно, как для Linux.

среда, 1 сентября 2010 г.

Eclipse: не добавляется слово в пользовательский словарь

Свежеустановленный Eclipse с CDT не знает слова destructor и подчеркивает его как неправильное. Если навести на слово мышь, то появляется всплывающее окно, предлагающее варианты действий. Один из вариантов — добавить слово в пользовательский словарь. Открывается окошко, в поле «User defined dictionary» которого можно указать путь к словарю. Однако это не работает, слово по-прежнему подчеркивается красным.

Ключевой момент — выпадающий список «Select spelling engine to use». В нем должно быть выбрано C/C++ spelling engine.

MS SQL Server: прочитать вывод хранимой процедуры

Q: Как сделать так, чтобы при запуске хранимой процедуры с помощью SqlCommand.ExecuteNonQuery() можно было получить то, что она выводит через print?

A: Использовать событие SqlConnection.InfoMessage.

private void RunProcedure()
{
  using (SqlConnection connection = new SqlConnection(…))
  {
    connection.InfoMessage += OnSqlConnectionInfoMessage;
    connection.Open();

    …

    connection.Close();
    connection.InfoMessage -= OnSqlConnectionInfoMessage;
  }
}

private void OnSqlConnectionInfoMessage(object sender, SqlInfoMessageEventArgs eventArgs)
{
  log.InfoFormat("Message from SQL Server: {0}", eventArgs.Message);
}