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 '';
}

microsoft.com

ax.docentric.com

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar