Dynamics 365 FO. Почему внутренние URL не работают в пакете?
Проблема
Dynamics 365 предоставляет инструмент URL Generator, для создания разделяемых и защищенных URL (далее, внутренние URL) для форм. Эти внутренние URL могут быть внедрены в отчеты, электронные письма, внешние приложения и др.
Внутренний URL указывает на конкретную форму D365 и также может содержать параметры, чтобы фильтровать отображаемые данные на форме. Например, можно создать URL на форму заказов, чтобы при открытии, отображался только конкретный заказ.
Приведенный код ниже не работает в пакете, потому что экземпляр объекта SessionContext содержит null:
var currentHost = new System.Uri(UrlUtility::getUrl());
В методе UrlUtility::getUrl() выполняется следующий код:
SessionContext serverContext = SessionContext::Get_Current();
Поэтому следует использовать метод EnvironmentFactory::GetApplicationEnvironment() и получить URL из Infrastructure.HostUrl:
IApplicationEnvironment env = EnvironmentFactory::GetApplicationEnvironment(); str currentUrl = env.Infrastructure.HostUrl;
Пример генерирования URL
Полностью метод будет выглядеть так:
public static str generateRecordUrl( str _menuItemName, MenuItemType _menuItemType, DataSourceName _dataSourceName, Map _fieldNameValueMap, DataAreaId _dataAreaId = curExt()) { str errorMsg = strFmt('Generating a link to %1 failed', _menuItemName); try { //str currentUrl = URLUtility::getUrl(); NOTE: this method doesn't work in batch! IApplicationEnvironment env = EnvironmentFactory::GetApplicationEnvironment(); str currentUrl = env.Infrastructure.HostUrl; System.Uri currentHostUrl = new System.Uri(currentUrl); UrlGenerator urlGenerator = new UrlGenerator(); urlGenerator.HostUrl = currentHostUrl.GetLeftPart(System.UriPartial::Authority); urlGenerator.MenuItemName = _menuItemName; urlGenerator.MenuItemType = _menuItemType; urlGenerator.Partition = getCurrentPartition(); urlGenerator.Company = _dataAreaId; if (_dataSourceName != '' && _fieldNameValueMap != null) { MapEnumerator mapEnumerator = _fieldNameValueMap.getEnumerator(); var requestQueryParameterCollection = urlGenerator.RequestQueryParameterCollection; while (mapEnumerator.moveNext()) { requestQueryParameterCollection.UpdateOrAddEntry(_dataSourceName, mapEnumerator.currentKey(), mapEnumerator.currentValue()); } } str generatedUrl = urlGenerator.GenerateFullUrl().AbsoluteUri; return generatedUrl; } catch (Exception::CLRError) { DocGlobalHelper::handleClrError(funcName(), errorMsg); } catch { DocGlobalHelper::handleError(errorMsg, true, funcName()); } return ''; }
Comments
So empty here ... leave a comment!