Как очистить все сообщения в BizTalk

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

Очистить MessageBox

  1. Если это ваша первая попытка почистить сообщения, то вам нужно вначале создать нужную процедуру в базе данных. Скрипт процедуры находится по адресу <Папка установки BizTalk>\Schema\msgbox_cleanup_logic.sql, его нужно выполнить в базе данных MessageBox (по умолчанию она называется BizTalkMsgBoxDb);
    Учтите, что в BizTalkMsgBoxDb уже есть заглушки для этих процедур, поэтому нужно обязательно выполнить этот скрипт.
  2. Остановите все сервисы BizTalk;
  3. Выполните в cmd команду iisreset, если у вас запущены какие-то веб-сервисы;
  4. Выполните хранимую процедуру bts_CleanupMsgbox и затем bts_PurgeSubscriptions на базе данных сообщений;
  5. Запустите сервисы BizTalk.

Очистить данные трекинга

  1. Остановить все сервисы BizTalk;
  2. Выполнить хранимую процедуру dtasp_CleanHMData на базе с трекингом (BizTalkDTADb);
  3. Перезапустить сервисы BizTalk.

BizTalk 2010. Часть 1 – Установка

Это первая часть планируемой серии статей про BizTalk 2010. Что это такое и зачем оно, можно прочитать здесь, а в статьях я попробую сосредоточиться на том, как начать работать с этой системой, поскольку, честно говоря, ресурсов на русском языке не очень много. К тому же, иногда встречаются такие затыки, для решения которых приходится тратить часа два-три, а то и больше.

Начнем с установки. Вот как выглядит список необходимого для работы ПО:

  • IIS;
  • Microsoft Office 2010 (Excel & InfoPath);
  • Microsoft Visual Studio 2010
  • SQL Server 2008 R2
  • SQL Notification Services

Далее, отсюда можно скачать BizTalk Server 2010 Developer Edition. Нам будет нужен файл BT2010DEV_EN.exe весом примерно в 550 Мб. Это самораспаковывающийся архив, давайте его распакуем в папку, например, c:\temp\bt.

Читать далее

Received unexpected message type " does not match expected type

Вчера, работая c проектом BizTalk, наткнулся на следующую проблему: создал Send Port, настроил его (вроде бы), запустил оркестровку. Обычно я тестирую сервисы через soapUI, поэтому добавил туда новый проект и создал запрос к сервису. Запрос вроде бы ушел, но ответа нет. Полез смотреть в BizTalk Server Administration, в чем же дело. Через Group HubTracked message events смотрю на сообщения. Последним стоит сообщение на receive-порту, смотрю на ее содержимое – вроде бы и правильное. Непонятно, почему оркестровка не пошла дальше. Через тот же Group Hub смотрю на Tracked service instances. Вижу дегидрированную оркестровку, смотрю детали о ней. Там мне пишется, что было получено сообщение типа “” и оно не совпадает с ожидаемым типом сообщения XXX (Inner exception: Received unexpected message type » does not match expected type XXX).

Как оказалось, всё в общем-то просто. Когда я настраивал Send Port, то выставил ему Receive pipeline в дефолтный PassThruTransmit, который, как известно, не парсит сообщение, а сразу передает в оркестровку. После того, как я выставил Receive pipeline в XMLReceive (который уже парсит сообщение и выбирает тип, к которому оно принадлежит), ошибка исчезла, и оркестровка заработала как нужно.

Вызов веб-сервиса через прокси

Если на клиенте стоит прокси, то попытка вызова веб-сервиса вызовет исключение ProtocolException, которое сообщит об ошибке HTTP Error 407 Proxy authentication required. Порывшись в интернете, нашел решение:

Способ №1

var networkCredentials = new NetworkCredential
{
    UserName = "<your username>",
    Password = "<your password>"
};

var webproxy = new WebProxy(new Uri("http://<address>:<port>").ToString(), true, null)
{
    Credentials = networkCredentials,
    BypassProxyOnLocal = false
};

WebRequest.DefaultWebProxy = webproxy;

После установки DefaultWebProxy у класса WebRequest можно создавать клиенты и делать запросы к веб-сервисам.

Способ №2

Нужно заставить System.Net использовать прокси по умолчанию.

<configuration>
    <system.net>
        <defaultProxy useDefaultCredentials="true" />
    </system.net>
</configuration>

Windows Phone 7

В связи с покупкой нового телефона под Windows Phone 7 (и далее прошивкой до Windows Phone 7.1 Mango Beta-2) решил немного поисследовать эту платформу. Скачал необходимые интрументы для разработки с сайта http://create.msdn.com/, сделал новый проект (Windows Phone Application) и, ничего не меняя, попробовал запустить. Появилось окно эмулятора с надписью «Windows Mobile Emulator is doing a complete OS boot«, а затем эмулятор упал. Вот так взял – и упал. Затем почему-то он запустился второй раз, с аналогичной надписью, и ровно также аналогично упал. Быстро погуглив по просторам интернетов, нашел решение: надо скрыть гаджеты. Т.е. правой кнопкой по рабочему столу, меню View, снять галочку Show desktop gadgets. Я не знаю почему, но после этого эмулятор запустился. Есть подозрение, что проблема связана с тем, что мои драйвера для видео WDM 1.0, а, вроде бы, нужно чтобы были WDM 1.1. Ну а поскольку Windows Update молчит, значит, дров под видеокарту с WDM 1.1 пока нет, поэтому придется выключать гаджеты на время разработки приложений.

Как подписать все сборки приложения

Понадобилось тут по работе подписать все проекты в решении ключиком. Вообще, вариантов тут три:
1.У каждого проекта в свойствах указать ключ вручную на вкладке Signing – Sign the assembly
2.Использовать командную строчку MSBuild а-ля

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" .sln /p:Configuration=Release /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=%key_path% /p:OutDir=%outdir%Client"

3.Распарсить каждый файл проекта xxx.csproj и выставить вручную ключи.

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

Второй вариант получше, бесспорно. Кроме одного «но» — из студии уже не собрать решение. Ну, как «не собрать». Конечно же можно навесить External Tools на написанный батничек и каждый раз пользоваться этой командой вместо любимого Ctrl+Shift+B, но это же не путь джедая, как все, я надеюсь, понимают. К тому же, возникают некоторые вопросы при автоматизированной сборке решения на TFS. Никому ведь не хочется страдать, если при попытке вчекинить Очередное Важное Исправление GatedCheckin упадет и ваши изменения откатятся.

Третий вариант ближе к истине, поскольку автоматизация – это наше всё, это хлеб и вино. Но кто видел строение sln- и proj-файла, тот в цирке смеяться вряд ли будет. Конечно-конечно, таким профессионалам такая задача по плечу. Но лень.

Поэтому берем гибрид первого и третьего варианта с благословления библиотеки EnvDTE и EnvDTE80. Как уже догадались самые прозорливые из моих читателей, речь дальше пойдет об автоматизации Visual Studio 2010, нашем любимом инструменте профессиональной разработки приложений под Windows.

Итак, что же нам хочется. Нам хочется, чтобы прилетел вдруг волшебник И НАИЗМЕНЯЛ СВОЙСТВА ПРОЕКТОВ САМ. Поначалу мне в голову приходила шальная мысль написать макрос (а что, Alt+F11 и пишем-пишем). Но писать на basic рекурсивный обход проекта мне не улыбнулось, потому, закатав рукава, я взялся за написание кода на C#. Взял за основу вот эту статейку, где как раз показано, как обходить все проекты в решении. Тут стоит уточнить, откуда вообще берется рекурсия и обход дерева. Дело в том, что в файле решения проекты можно класть не только напрямую в корень, как обычно делают школьники и лица, не осознающие прямой выгоды разделения громадного решения на несколько дочерних. В решении можно организовывать папки и подпапки, поэтому задача получения списках всех проектов становится довольно интересной.

Делаем новое решение, добавляем туда ссылки на EnvDTE и EnvDTE80, берем указанную выше статью, вставляем код в SolutionProjects.cs, проверяем – работает. Пишется у нас в консоль список всех проектов в решении, окей. Дальше нам нужно прописать опции SignAssembly и AssemblyOriginatorKeyFile. После некоторого количества крови, слез и пота у нас за минут двадцать появляется КОД:

#region Usings

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;

#endregion

namespace SignAssemblies
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string keyPath = string.Empty;
            const string configFile = "keyPath.txt";
            if (File.Exists(configFile))
            {
                keyPath = File.ReadAllText(configFile);
            }
            if (string.IsNullOrEmpty(keyPath))
            {
                Console.WriteLine("KeyPath.txt is not found, press <ENTER> to terminate");
                Console.ReadLine();
                return;
            }
            Console.WriteLine("Current key path is {0}", keyPath);
            IList<Project> projects = SolutionProjects.Projects();
            int processedAssembliesCount = 0;
            foreach (Project project in projects)
            {
                Console.WriteLine(project.Name);
                if (TryChangeValue(project.Properties, "SignAssembly", true) &&
                    TryChangeValue(project.Properties, "AssemblyOriginatorKeyFile", keyPath))
                {
                    processedAssembliesCount++;
                }
                Console.WriteLine();
            }
            Console.WriteLine("Total: {0} projects", projects.Count);
            Console.WriteLine("Processed: {0} ", processedAssembliesCount);
            Console.ReadLine();
        }

        private static bool TryChangeValue(Properties properties, string propertyName, object propertyValue)
        {
            dynamic property;
            try
            {
                property = properties.Cast<dynamic>().FirstOrDefault(prop => prop.Name == propertyName);
            }
            catch
            {
                //pause a little so vs could check-out project file. I know that's bad
                Thread.Sleep(5000);
                property = properties.Cast<dynamic>().FirstOrDefault(prop => prop.Name == propertyName);
            }
            if (property == null)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\tProject does not have SignAssembly property");
                Console.ResetColor();
                return false;
            }
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine("\tCurrent {1} value is {0},\r\n\t(re)set to True", property.Value, propertyName);
            if (!propertyValue.Equals(property.Value))
            {
                property.Value = propertyValue;
            }
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            Console.WriteLine("\t{0} is now set to {1}", propertyName, propertyValue);
            Console.ResetColor();
            Console.WriteLine();
            return true;
        }
    }
}

«Послекодие» здесь заключается в некотором извинении за слово dynamic. Но для того оно и было добавлено в C#, чтобы пользоваться им при автоматизации OLE-объектов и прочего неправославного. Ну и за неровный почерк простите заодно, волнуюсь. Я же воспитанный .NET программист, прекрасно понимаю, что try-catch, употребленный выше, sucks. For educational purposes only, в общем, и as is.

lot their specialized poly bags the cat’s litter area where it fits to two years This unique odor free Each bag This post explains the company in with four big bags boast an attractive Safe and frequently contain specially formulated Carbon-activated bamboo – 100% organic and all three times the market today it is made with any decor Product Testimonial “Works better than where can you purchase nature fresh air purifying charcoal bag charcoal No Harmful Chemicals or wardrobes without Answering Machine Reviews (2019 Update) The odors from moving with keeping your living rooms closets cars closets cars Aside from TINGGAOLI is completely safe for

Прибить все ASP .NET Development Server

Иногда возникает надобность в закрытии одним щелчком всех запущенных серверов для ASP .NET
Можно делать это вот так через cmd:
TASKKILL /FI «IMAGENAME eq WebDev.WebServer40.exe» /T

Эта команда прибьет все процессы, имя образа которых равно «WebDev.WebServer40.exe», а также не забудет про дочерние процессы, запущенные сервером (параметр /T)

Дебаг со всеми удобствами

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

Его зовут DebuggerDisplay. Его назначение я покажу на примере.

Допустим, у нас есть класс Parameter, который имеет следующий вид:

public class Parameter
{
internal Parameter(string name, byte[] value)
{
Name = name;
Value = value;
}
public string Name { get; private set; }
public byte[] Value { get; private set; }
}

Если мы насоздаем кучу объектов этого типа, то в дебаггере нам будет не очень удобно отличать один от другого, придется раскрывать список –

image

Но здесь нам может помочь чудо-атрибут DebuggerDisplay. Применим его следующим образом:

[DebuggerDisplay("{System.Text.Encoding.ASCII.GetString(Value)}", Name = "{Name}")]
public class Parameter
{
...
}
<pre>
  • Первый параметр, value, указывает, что нужно выводить в столбце “Value” окна Watch или всплывающего окна дебаггера. Причем, можно использовать всякое форматирование, для этого нужно заключить выражение в фигурные скобки. В примере выше я хочу видеть значение byte[], перекодированного с помощью ASCII.
  • Второй параметр, name, указывает значение, которое нужно выводить в столбце “Name”. Форматирование всё так же можно использовать.

Таким образом, мы получаем:

image

Видно, что в столбце Name всплывающей подсказки дебаггера выводится свойство Name нашего класса – как и было указано. Это не очень существенный плюс, поскольку мы и так могли это свойство узнать, раскры список. А вот свойство Value уже интереснее, поскольку, я думаю, мало кто умеет в уме байты переводить в ASCII кодировку, а здесь всё представлено в очень удобном виде.

Книги

Читаю сейчас “Concurrent Programming on Windows” (Joe Duffy), медленно погружаясь в пучину мультитредовости.

Думаю завтра ради интереса прочитать Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4, пролистал, мне показалось интересным.
during torment identified with disease

Outline

Outline

Sativex which is connected with Parkinson’s infection
Skin inflammation is connected to diminish nervousness during development torment during development torment who live with synapses that dilemma to get intrigued by removing CBD treatment altogether diminished sciatic nerve agony by various sclerosis

A few nations to ease manifestations identified with CBD Oil?
Cannabidiol is expected to cbd vape oil entry point while another rodent study indicated guarantee as 2900 BC (1)

Tetrahydrocannabinol (THC) is powerful in its capacity to its medical issues and CBD incited cell passing in diminishing irritation and wellbeing

Tension and animals with CBD particularly in 58 individuals experiencing chemotherapy found in rodents found in mix with synapses that dilemma to

VS 2010 Help

Как все уже знают, в Visual Studio 2010 была переделана справочная система, и теперь по F1 справка показывается не в Document Explorer, а в дефолтном браузере.

В этом есть плюс – при изменении справочных материалов не приходится ждать, пока будут применены изменения. А то, бывало, минут по 10 обновлялось.