2013-08-28 3 views
1

Фон: В настоящее время я работаю с бизнес-коннектором Dynamics AX 2009 в C#. Для моего текущего проекта мне нужно подключиться к нескольким серверам AOS; в идеале все параллельно, хотя последовательно были бы адекватными. Я могу подключиться к одному серверу (любому серверу) успешно, но всегда ударяю LogonSystemChangedException, если попытаюсь подключиться к другому серверу (или даже к тому же серверу, но с помощью null для подключения к нему по умолчанию вместо указанного имени). Я даже получаю эту ошибку, если я Logoff и Dispose предыдущего BC, установите переменную, ссылающуюся на нее, на null, поставьте поток в сон на 30 секунд, вызовите GC.Collect() (извините - отчаянные времена), затем создайте совершенно новый BC, смотрящий на другой экземпляр AX в целом в новой переменной. Это говорит о том, что код MS имеет некоторый статический объект за кулисами, который сохраняет эту информацию на протяжении всего процесса жизни.Dynamics AX 2009 Business Connector Logon

Найдено Предлагаемые решения:

  • Я нашел предложенное исправление использования LogonAs наряду с правильным форматированием для экземпляра AOS здесь: http://asonofmartha.blogspot.co.uk/2010/06/ax-net-business-connector-how-to-open.html - но попытался это не повезло.

  • Единственное, что я нашел до сих пор, что работает - это создать второй процесс для второго соединения - но это неприятное решение.

Почему: Моя причина для подключения к нескольким AOSes это я пишу табличную функцию CLR, который подключается к данному примеру AX, перебирает все серверы AOS на этом экземпляре, то возвращает список всех клиенты & их SPIDS (которые видны только при подключении к AOS этого сеанса). Это позволяет нашему программному обеспечению мониторинга возвращать информацию о сеансе пользователя AX, когда мы видим блокировку базы данных.

Вопрос: Есть ли способ подключения к нескольким AOS с помощью AX .NET Business Connector в рамках одного процесса (последовательно, если параллельно не возможно)?

ответ

3

Некоторое время назад я столкнулся с этой проблемой и не получил решения. Я спросил MS через мой план обслуживания работодателя, и, похоже, что .NET BC хранит какой-то кеш данных соединения, который не будет выпущен до тех пор, пока не закончится весь процесс. Это не планируется изменять, так как .NET BC будет полностью устаревать в следующей версии.

То, что я сделал, это разработать службу, которая запускалась против AOS, а затем запустить три экземпляра службы, каждая из которых передаёт информацию из AOS в таблицу SQL, где я могу собрать всю информацию.

Надеюсь, это поможет.

1

Поскольку вы все равно хотите параллелизма, почему бы не пойти на подпроцессы?

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

Estavan ответил на ваш вопрос, как указано.

+0

Thanks Jan - это мое текущее мышление. Я поставил несколько вопросов, чтобы ловить рыбу за идеями о том, как лучше всего обойти эту проблему. Завтра я начну читать решения, чтобы определить, какие из них имеют наибольший смысл. В настоящее время подпроцессы чувствуют себя лучше, чем сервисы, поскольку это позволяет определять параметры во время выполнения, а не настраивать службы раньше времени. – JohnLBevan