Изменение поведения булевого параметра в функции скрипта

В этой статье показано, как устранить проблему, из-за которой поведение логического парама в функции скрипта изменилось.

Исходная версия продукта: BizTalk Server 2013 Branch, BizTalk Server 2013 Developer, BizTalk Server 2013 Enterprise, BizTalk Server 2013 Standard
Исходный номер базы знаний: 2887564

Симптомы

В BizTalk Server 2013 поведение логических параметров в функциях сценариев в BizTalk Maps изменилось.

Например, рассмотрим следующий код в функции скриптирования:

public int AddIfTrue(int param1, int param2, bool addNum)
{
    if (addNum)
    return param1+param2;
    else return param1;
}
  • В BizTalk Server 2013 поведение выглядит следующим образом:

    • Если addNum является true, false или любым другим значением, то выходное значение - param1+param2.
    • Если addNumпусто, выходные данные — param1.
  • В предыдущих версиях BizTalk поведение было следующим образом:

    • Если addNum равно false, то вывод будет param1.
    • Если addNum равно true, то вывод — это param1+param2.
    • Если addNum пуст или имеет любое другое значение, функция завершается ошибкой Строка не распознана как допустимое логическое значение.

Причина

Начиная с BizTalk Server 2013 модуль преобразования BizTalk использует класс .NET XSLCompiledTransform , а не старый XSLTransform класс из-за многих преимуществ производительности.

Логическое поведение параметра в XSLCompiledTransform классе отличается от XSLTransform класса. Это новое поведение описано здесь: булева функция.

Решение

Чтобы вернуться к предыдущему поведению, код функции скрипта можно изменить так, чтобы он принимал параметр String вместо булевого, а затем преобразовал String в булевое значение внутри кода функции следующим образом:

public int AddIfTrue(int param1, int param2, string addNum)
{
    bool addNumBool = System.Convert.ToBoolean(addNum);
    if (addNumBool)
    return param1+param2;
    else return param1;
}

Дополнительная информация

Кроме того, можно настроить подсистему преобразования BizTalk 2013 для использования старого XSLTransform класса. Этот подход не рекомендуется, так как среда потеряет много улучшений производительности и использования памяти, предоставляемых классом XSLCompiledTransform . Это изменение можно внести, добавив DWORD UseXslTransform со значением 1 в следующих местах:

  • Для 64-разрядных экземпляров узлов BizTalk: HKLM\SOFTWARE\Microsoft\BizTalk Server\3.0\Configuration
  • Для 32-разрядных экземпляров узлов BizTalk и функциональности тестовой карты Visual Studio: HKLM\SOFTWARE\Wow6432Node\Microsoft\BizTalk Server\3.0\Configuration