Проблема
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 '';
}
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!