|
09.05.2013, 18:26 | #1 |
Участник
|
Axapta 2009 напрямую из ASP.NET
Наверное, всем, кто поупражнялся в использовании Портала, в какой-то момент приходила мысль о возможности использования Аксапты как источника данных и бизнес-логики для создания легкого сайта, не отягощенного SharePoint-ом.
Как мне показалось, единственным способом получить данные из Аксапты на asp-странице является использование контрола AxDataSource, для которого нужно выбрать заранее созданный в Аксапте DataSet. Аксаптовский DataSet чем-то очень похож на DataSet в web-проекте на С#. Такой же набор таблиц со связями. Только на C# DataSet нужно собирать в web-проекте, а, еcли использовать Аксаптовский, то он уже готов и нужно просто прицепиться к нему AxDataSource-ом. И все, вроде, замечательно работает внутри Visual Studio 2008 на встроенном веб-сервере, но, как только мы размещаем приложение на IIS, то присутствие на asp-странице AxDataSource сразу же приводит к ошибке, выскакивающей в браузере: Цитата:
Server Error in '/' Application. No .NET Business Connector session could be found. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: Microsoft.Dynamics.Framework.BusinessConnector.Session.Exceptions.NoKernelSessionException: No .NET Business Connector session could be found. Source Error: Line 43: <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />Line 44: Line 45: <dynamics:AxDataSource ID="AxDataSource1" runat="server" Line 46: DataSetName="EPReferral" ProviderView="Referral">Line 47: </dynamics:AxDataSource> Source File: c:\A5\Default.aspx Line: 45 Stack Trace: [NoKernelSessionException: No .NET Business Connector session could be found.] Microsoft.Dynamics.Framework.BusinessConnector.Session.DynamicsSession.get_AxaptaAdapter() +55 Microsoft.Dynamics.Framework.Metadata.Ax.MetadataCache.GetDataSetMetadata(ISession session, String dataSetName) +42 Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxDataSource.GetMetadata(String dsName, Boolean reThrow) +286 Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxDataSource.ValidateDataSetNameAndProviderView(String dsName, String providerName, DataSetMetadata& metadata) +103 Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxDataSource.set_DataSetName(String value) +105 ASP.default_aspx.__BuildControlAxDataSource1() in c:\A5\Default.aspx:45 ASP.default_aspx.__BuildControlform1() in c:\A5\Default.aspx:18 ASP.default_aspx.__BuildControlTree(default_aspx __ctrl) in c:\A5\Default.aspx:1 ASP.default_aspx.FrameworkInitialize() in c:\A5\Default.aspx.cs:912307 System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +55 System.Web.UI.Page.ProcessRequest() +91 System.Web.UI.Page.ProcessRequest(HttpContext context) +240 ASP.default_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\bc314b82\d1cf965\App_Web_goaoiejq.0.cs:0 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171 Version Information: Microsoft .NET Framework Version:2.0.50727.5466; ASP.NET Version:2.0.50727.5456 Дело в том, что сама сессия с Аксаптой, вроде бы, предварительно создается методом logon( ",",",") класса Axapta в нэйм-спейсе Microsoft.Dynamics.BusinessConnectorNet и существование сессии проверяется выводом ее номера и количества подключений, но AxDataSource упорно эту сессию видеть не хочет. Очень хотелось бы знать, - кто-нибудь занимался программированием на asp.net напрямую без SharePoint, используя в качестве источника данных Аксапту и каким образом обходил описанную сложность? Ах, да, самое интересное! Если для созданного легокого сайта пул приложений заменить с родного для сайта, на пул приложений работающего Портала на SharePoint, то все начинает работать. AxDataSource видит сессию и нормально таскает данные из Аксапты. Но, при этом любые попытки натаскать настройки из web.config Портала в web.config легкого сайта ни к чему не приводят! |
|
09.05.2013, 19:01 | #2 |
Участник
|
Можно еще создать обычный DataSet в VS (xsd-схема), написать для каждого DataTable свой DataAdapter и выводить данные DataGrid. Если уж вы ушли от портала Dynamics AX, то и пишите с использованием только чистого .NET. Мне кажется, так меньше граблей соберете.
|
|
10.05.2013, 16:56 | #3 |
Участник
|
Цитата:
Каким образом можно в нашем случае использовать DataAdapter, кроме непосредственного подключения к SQL базе Аксапты? Насколько я понимаю, какого-то готового провайдера данных для Аксапты нет. А использование базы Аксапты напрямую лишает всех преимуществ работы с Аксаптовским DataSet. Но, это еще пол-беды. Вы же не собираетесь программировать генерацию родных для Аксапты RecId? Или вы имели в виду что-то другое? |
|
11.05.2013, 00:24 | #4 |
Участник
|
Вопрос к специалистам по ASP.NET
Попробовал открыть форму "Активные пользователи" в Аксапте и посмотреть, что происходит, когда на тестовой asp.net странице я пытаюсь вызвать метод Logon() из Аксаптовского класса Axapta, лежащего в сборке Microsoft.Dynamics.BusinessConnectorNet .
Оказалось, что сессия с Бизнес-коннектором честно устанавливается, но при этом, присутствующий на asp.net странице Аксаптовский контрол AxDataSource эту сессию не находит. Дальше интереснее. Если заменить родной пул приложений сайта на пул приложения работающего на SharePoint Аксаптовского портала, то можно увидеть следующее... Сессия создается еще до загрузки какой либо страницы с сайта! То же самое происходит, когда мы открываем тестовый сайт в Visual Studio 2008. Сессия опять же создается еще до запуска какой либо страницы. Все это наводит на мысль, что всегда инициализация контрола AxDataSorce происходит ДО вызова любого метода, вызванного событием на asp.net странице, в одном из которых я использую Logon(). То есть, получается, что у нас должен быть создан класс C#, который не привязан ни к одной странице и один из методов этого класса должен запускаться по событию не на странице, а по событию IIS. Например, по любому запросу любой страницы из браузера клиента. Дело в том, что веб-приложение кардинально отличается от виндовс-приложения тем, что у веб-приложения нет метода Main(). Соответсвенно, нужно как-то извратиться, чтобы установить сессию с Аксаптой один раз, когда клиент зашел на сайт. Далее, держать ее включенной все время, пока он запрашивает страницы и, наконец, завершить, когда клиент ушел с сайта. Вот тогда, наверное, AxDataSource всегда будет работать. Попытки посмотреть, как это устроено в Портале на SharePoint, ни к чему не приводят. Там все закрыто и посмотреть код невозможно. Получается, что в обычных asp.net приложениях все подключения к данным производятся путем настройки ConnectionString в web.config сайта. В традиционных windows-приложениях с помощью Logon() и далее работой только с записями отдельных таблиц, но не с Аксаптовским DataSet (судя по хелпу) А вот использование Data Source в плане интеграции с веб-приложениями нигде не документируется. Вопрос к знатокам, - как заставить работать код в классе, не привязанный к конкретной странице не по событиям страницы и в каком NameSpace находятся обработчики событий IIS, к которым можно было бы привязать метод с вызовом Logon() ? |
|
11.05.2013, 12:08 | #5 |
Участник
|
Цитата:
Сообщение от Narayana
Все это наводит на мысль, что всегда инициализация контрола AxDataSorce происходит ДО вызова любого метода, вызванного событием на asp.net странице, в одном из которых я использую Logon(). То есть, получается, что у нас должен быть создан класс C#, который не привязан ни к одной странице и один из методов этого класса должен запускаться по событию не на странице, а по событию IIS.
Цитата:
|
|
|
За это сообщение автора поблагодарили: Narayana (1). |
11.05.2013, 12:52 | #6 |
Участник
|
Цитата:
Сообщение от gl00mie
Будучи далек от веб-разработки, я слышал, что подобный код можно написать в обработчиках событий Application_Start или Session_Start в Global.asax
А еще в ASP.NET при работе с IIS начиная с версии 7.5 (который идет на W7 и W2K8 R2) можно выполнять код для "разогрева" веб-приложения, реализуя интерфейс System.Web.Hosting.IProcessHostPreloadClient, см. Автозапуск приложений ASP.NET Спасибо. Попробовал вызвать Logon() из global.asax . Действительно, соединение создается и в списке активных пользователей появляется, но, к сожалению, AxDataSource и другие контролы Аксапты типа AxUserControlWebPart это соединение не видят. Все получается немного глубже. А именно... При создании сессии в форме "Активные пользователи" появляется два активных пользователя, - с типами сеансов "Business Connector" и "Веб пользователь". Причем, если попытаться вызвать Logoff(), эти соединения никуда не исчезают. А если при существующей сессии попытаться еще раз вызвать Logon(), то добавляется только новый сеанс "Веб пользователь", а "Бизнес Коннектор" не появляется. Похоже, авторизация не происходит до конца... |
|
13.05.2013, 14:16 | #7 |
Участник
|
Цитата:
|
|
13.05.2013, 23:40 | #8 |
Участник
|
Цитата:
Сообщение от Dreadlock
Есть приблуда которая позволяет просматривать код используя Рефлексию
То, что Портал не отображается корректно под Хромом, все перевернуло в голове. Вот, представьте себе... вы выделяете из Портала нужные куски, настраиваете доступ для потенциальных представителей, которые могут быть довольно разношерстным народом в отличие от корпоративных пользователей. Долго возитесь с допрограммированием системы регистрации пользователей... Все готово... Вы пробуете под разными браузерами и оказывается, что под Хромом, на котором работает больше 30% народа, ваше приложение нормально не работает. И ваши ощущения? )) Нет. Что-то не так в Датском королевсте... ) Все-таки для большой корпоративной системы типа Аксапты должны существовать эффективные инструменты работы с розницей и создания Фронт-офисов под вебом. А SharePoint для этого никак не катит. |
|
13.05.2013, 11:55 | #9 |
Участник
|
Цитата:
Готового нет, нужно написать. |
|
13.05.2013, 23:42 | #10 |
Участник
|
Цитата:
А я как раз и не могу добиться, чтобы он находился для работы с данными... ) Потому как, если найдется, то можно ведь и DataSource использовать... |
|
11.05.2013, 14:34 | #11 |
Участник
|
Все там до конца происходит, иначе сессия бы не создалась вовсе. См. Закрыть AxaptaCOMConnector из AXAPTA. На счет отображения на форме активных пользователей см. также Форма активных пользователей (SysUsersOnline) и сессии COM-коннектора
Последний раз редактировалось gl00mie; 11.05.2013 в 14:36. |
|
13.05.2013, 18:06 | #12 |
----------------
|
под какой учеткой работает пул приложений?
а impersonate (олицетворение) у вас как настроено на веб-приложении? где хранится инфа о сессии в базе или в памяти? |
|
13.05.2013, 23:31 | #13 |
Участник
|
Цитата:
В Basic Settings для сайта есть параметры доступа к физическому каталогу сайта. У меня в Path credentials указано Application user (path-through autentication). При этом тест говорит о том, что невозможно проверить доступ. Я так понимаю, что из-за неопределенности в данный момент того, кто будет подключаться к сайту. Если поставить админа домена, то тест проходит. Но это не меняет доступность сессии Бизнес-коннектора. Я это до сих пор понимал как то, что для пользователя, зашедшего на сайт, проверяются права доступа к каталогу сайта. А что такое учетная запись пула приложений, я, вообще, не понимаю. Слово Autentity приводит меня в состояние умственного ступора. Я нигде не нашел его строгого определения, но склоняюсь к тому, что это сопоставление процесса и учетной записью пользователя, под которой этот процесс коннектится куда-то. Вообще, система безопасности, это самое болезненное для меня место. Никак невозможно найти краеугольный камень, от которого нужно отталкиваться, чтобы понять всю систему. Имперсонайшн настроен на Authenticated user. Я это понимаю так, что пользователь сначала заходит на сайт, а затем доступность ресурсов сайта определяется по правам конктретного пользователя на этих ресурсах. Было бы интересно узнать, так ли это? "где хранится инфа о сессии в базе или в памяти" А хрен ее знает, где она хранится! Если честно, то в голове состояние полной дезориентации. Пока что я пытаюсь от понимания обычного доступа к файлам для обычного пользователя перейти к пониманию прав процессов. Но, смешение всякого рода явлений, которые имеют свои права, приводит к ощущениям Алисы в Зазеркалье... ) Вот, например, ваш вопрос про учетную запись для пула приложений... Мне казалось, что пул приложений, это просто изолированное пространство, в котором выполняется приложение. Или какой-то выделенный процесс, который создается, когда возникает новый сайт. Если изменить пул приложений для данного приложения, то это приложение будет выполняться в чужом процессе. То есть, получается, что учетка для пула приложений, это учетка для процесса? В общем, вытащил на свет Божий книжку Ульяма и Станека Internet Information Services 7.0 и пытаюсь читать, испытая возмущение, что приходится этим заниматься вместо программирования... ) Если вы сможете дать определение для "Identity", буду вам очень признателен. |
|
14.05.2013, 12:52 | #14 |
Участник
|
Цитата:
Разобрался с учеткой пула приложений! Ура, все работает!!! Оказывается, не только сам сайт и приложение должны иметь правильный аккаунт для доступа к ресурсам, но и пул приложений тоже... ))) Итак, Аксаптовский DataSource вполне себе можно использовать без всяких SharePoint-овских извращений и работает это все довольно быстро! |
|
15.05.2013, 07:29 | #15 |
Участник
|
Простите за нескромный вопрос. А что именно вы добились такой разработкой? Перечитал просто пост и не понял - что в итоге-то получилось?
Веб-приложение на C# которое через BC тягает данные из АХ? Поделитесь опытом, пожалуйста, для личной базы знаний. |
|
15.05.2013, 19:00 | #16 |
Участник
|
Цитата:
Да, добился возможности создания веб-приложения без SharePoint, которое через BC тягает данные из Ax. И не просто данные, а данные в виде Аксаптовского DataSet. То есть, Аксапта не просто становится заменителем SQL server для веб-приложения, а одновременно Data Access Layer + Business Logic Layer в одном флаконе. А это означает, что Аксапта становится не только системой управления предприятием, а еще и большей частью движка для сайта, насыщенного данными. По сути дела, я просто раскопал существующую технологию свободной веб-разработки для Аксапты, которая на фоне Портала замалчивается. На самом-то деле, эти приемы работы с Аксаптой через ASP.NET нужно было жирно осветить в документации, но у них не хватило возможностей и Портал-то нормально описать. |
|
|
За это сообщение автора поблагодарили: Romb (1), Logger (8). |
Теги |
asp.net |
|
|