Разработка конфигурационного серверного кода в пользовательском проекте
Добрый день!
Выполнил по шагам действия описанные в https://academy.terrasoft.ru/documents/technic-sdk/7-12/razrabotka-konfiguracionnogo-servernogo-koda-v-polzovatelskom-proekte. При запуске проекта выходит ошибка:
Terrasoft.Common.NullOrEmptyException was unhandled by user code HResult=-2146232832 Message=The "Default" workspace assembly is not initialized Source=Terrasoft.Core StackTrace: at Terrasoft.Core.Configuration.SysWorkspace.get_WorkspaceAssembly() at Terrasoft.Core.SchemaManager`1.get_Assembly() at Terrasoft.Core.SchemaManagerItem`1.get_Instance() at Terrasoft.Core.Manager`2.GetInstanceByName(String name) at Iplast.MyContactCreator.Execute(UserConnection userConnection) in c:\users\adm-ruslan\documents\visual studio 2015\Projects\mycompany\mycompany\MyContactCreator.cs:line 16 at Terrasoft.Tools.WorkspaceConsole.WorkspaceConsoleApplication.ExecuteScript(String assemblyFileName, String typeName) InnerException:
В "Конфигураторе" сообщение "The "Default" workspace assembly is not initialized" не отображается. На всякий случай из Visual Studio запускал BuildWorkspace и RebuildWorkSpace, компиляция прошла успешно, но это не помогло.
Подскажите, пожалуйста, в чем проблема.
Нравится
Ошибка возникает во время получения схемы:
var schema = userConnection.EntitySchemaManager.GetInstanceByName("Contact");
Просто случайно вместо Contact указал Contac и ошибка поменялась на:
Item with name "Contac" not found
Т.е. обращение к приложению происходит, но по какой то причине рабочее пространство Default оказывается не инициализировано. В чем дело не понимаю.
Перевел сайт на http протокол, т.к. стал подозревать что проблема может быть в неподписанном сертификате. Не помогло.
Дело не в протоколе, такое сообщение значит, что не скомпилировалась конфигурация. См. аналогичное обсуждение тут.
Нужно опубликовать какую-то схему, чтобы сборка конфигурации обновилась.
Почему подумал на протокол, потому что пример с Executor'ом как раз не работал с неподписанным сертификатом. После того как перевел сайт на http, Executor успешно отработал. Тот же самый пример через WorkSpaceConsole не работает. Попробую опубликовать объект, т.е. таблицу.
Зверев Александр,
Опубликовал таблицу с префиксом Usr, публикация успешно завершилась. Запустил проект из VS, та же ошибка. Засада какая то.
Если не работает только из Visual Studio, интеграция с ней может быть настроена неверно. Как настроить, см. тут.
VS настроил как описано в инструкции. Команды build, rebuild и update рабочего пространства выполняются без ошибок. Но выполнение проекта все равно выдает ошибку: The "Default" workspace assembly is not initialized
Вот что нашел с помощью отладчика:
Почему-то переменная "Assembly" не инициализирована.
Как это исправить?
Это и значит, что генерация кода и компиляция его в dll не прошли успешно. Если при компиляции из раздела «Конфигурация» всё нормально, а при компиляции при помощи внешних инструментов — нет, то что-то не то в их настройке.
Скорее всего так и есть. Еще раз перепроверил параметры внешних команд VS (build и rebuild), обнаружил что не был указан параметр "confRuntimeParentDirectory", хотя был уверен что копи-пастом все переносил из учебника. Надеюсь это решит проблему. Если нет то продолжу свой квест - при ручной загрузке рабочего пространства командой:
userConnection.Workspace.WorkspaceAssembly = fswal.LoadAssemblyToWorkspace(userConnection.Workspace);
путь к сборке не верный указан:
Could not find a part of the path 'C:\inetpub\BPMdevelopment\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.WebApp\Terrasoft.Configuration\bin\Terrasoft.Configuration.dll'.
Не найду где это указывается в настройках. Но уже есть за что зацепиться.
Судя по два раза повторяющемуся названию папки «Terrasoft.WebApp», где-то прописан относительный путь к «Terrasoft.Configuration.dll», начиная с неё, в результате утилита приписывает слева путь места, откуда она запущена и полный путь выходит неправильный. Попробуйте найти эту настройку и поменять на полный путь, начиная с буквы диска.
Добавление параметра "confRuntimeParentDirectory" не решило проблему. Найти где прописан путь пока тоже не удалось.
В таком случае, пока не найдёте место, где прописан путь, можно разрабатывать из веб-интерфейса системы.
Из веб интерфейса писать C# код не удобно - нет отладки. К тому же я хочу реализовать свою библиотеку.
Тогда продолжайте искать, где неверно прописан путь.
Проблема в том что я не помню чтобы прописывал какой-либо путь кроме команд Build, Rebuild и Update Workspace. И в файле Terrasoft.Tools.WorkspaceConsole.exe.config что либо похожего на путь не вижу:
есть только один ключ "ConfigurationProjectPath", который изначально был пустым. И за что он отвечает не понятно.
Спасибо, Александр, за помощь! Решил указать параметр "configurationPath" и переменная "Assembly" стала инициализироваться. Но, этого не было написано в инструкции по созданию пользовательского проекта. Очередной шаг в квесте выполнен. Следующее испытание: "Value for argument "outputDirectory" must be specified", но его уже обсуждали здесь. Должно и мне помочь.
Руслан, Вам спасибо, что сообщили всем, в чём дело было.
Под каждой статьёй есть две кнопки, можно нажать и в появившееся текстовое поле ввести, чего не хватает статье.
Спасибо, Александр, за указание возможности ввести недостающей информации в статье. Надеюсь таких сюрпризов больше не будет. А если будет, то обязательно дополню статью. В этот раз я написал в техподдержку с просьбой актуализировать статью.
Получается, что параметры командной строки (как минимум, некоторые) также могут быть использованы и в конфиге.
Одна ремарочка - чтобы код работал мне все же приходится принудительно инициализировать переменную "Assembly" с помощью кода:
FileSystemWorkspaceAssemblyLoader fswal = new FileSystemWorkspaceAssemblyLoader(); userConnection.Workspace.WorkspaceAssembly = fswal.LoadAssemblyToWorkspace(userConnection.Workspace);
Без этого отваливается с ошибкой:
"The "Default" workspace assembly is not initialized"
Получается, что параметры командной строки (как минимум, некоторые) также могут быть использованы и в конфиге.
Что вы имеете в виду, Александр?
Вы посмотрели список параметров командной строки из статьи по ссылке, дописали один из них как параметр в config-файл и заработало.
Не совсем так. Я дописал в командную строку VS, как это описано в академии. В config-файл ни чего не писал.
Все же интересно, почему переменная "Assembly" не инициализируется при создании объекта (UserConnection), который его содержит. Ответ должен находиться у UserConnection, наверно. Что еще не хватает чтобы все работало гладко?
Когда разработка логики закончится, проверите при обычном использовании внутри системы, вне Visual Studio. Должно будет всё работать и так.
Столкнулся с такой же ошибкой.
Помогла замена существующей папки с WorkspaceConsole (\DesktopBin\WorkspaceConsole) на чистую, с дальнейшим развертыванием через PrepareWorkspaceConsole и указания актуальной строки подключения к БД.
Правда, имеются некоторые неудобства при отладке: когда добавляю в зависимости сборку Terrasoft.Configuration и использую уже реализованные ранее типы данных, не видно информации о локальных переменных, не работает функционал в окнах отладки "Locals", "Watch", "Immediate".
При попытке, к примеру, получить доступ к какому-либо свойству объекта, получаю ошибку "error CS7069: Reference to type <название типа> claims it is defined in 'Terrasoft.Configuration', but it could not be found".
Если же не использую типы из Terrasoft.Configuration, отладочная информация отображается корректно.