Bir müşterimizde Workflow formu açılmıyordu. Üstüne üstlük verdiği hata mesajı çok da açıklayıcı değildi:
Event log incelemesi yaptığımda hatayla ilgili bir log kaydı bulamadım. İnternette tavsiye edilen çözümlerin tümünü sırayla denedim, ancak hiçbiri işe yaramadı:
-Incremental CIL
-Full CL
-XppIL klasörünü silip AOS restart
-Full compile ve Full CIL
-Client reinstall
Bir blogda WorkflowEditorHost formunda try/catch bloğunda CRL hataları için iç hata yakalaması yapılmadığından bahsediliyordu. Bloggerın yaptığı gibi koda ekleme yapmaya karar verdim ve aşağıdaki kırmızı işaretli satırları ekledim:
private void build()
{
#Admin
#AOT
//AGC memre
#OCCRetryCount
System.Exception ex;
//AGC memre
WorkflowVersionTable versionTable;
WorkflowTypeName templateName;
str domainUser;
UserInfo userInfo;
NumberSeq num;
SysInfoAction_MenuFunction sysInfoAction;
TreeNode treeNode;
SysDictWorkflowType workflowType;
int classId;
num = NumberSeq::newGetNum(SysWorkflowParameters::numRefSequenceId(), false, true);
if (num == null)
{
sysInfoAction = SysInfoAction_MenuFunction::newMenuItem(menuitemDisplayStr(SystemParameters), MenuItemType::Display);
throw error("@SYS108268", '', sysInfoAction);
}
versionTable = element.args().record();
//BP Deviation Documented
select userInfo where userInfo.Id == curUserId();
domainUser = userInfo.NetworkDomain + '\\' + userInfo.NetworkAlias;
if (element.args().parmEnumType() == enumNum(WorkflowConfigurationActionType) &&
element.args().parmEnum() == WorkflowConfigurationActionType::New)
{
templateName = element.args().parm();
treeNode = TreeNode::findNode(#WorkflowTypesPath + #AOTDelimiter + templateName);
if (treeNode)
{
workflowType = new SysDictWorkflowType(templateName);
classId = className2Id(workflowType.document());
if(classId == 0)
{
throw error("@SYS108554" + '. ' + "@SYS113219");
}
try
{
workflowConfiguration = Microsoft.Dynamics.AX.Framework.Workflow.Model.WorkflowModel::
Create(templateName, curext(), curUserId(), domainUser);
}
catch (Exception::CLRError)
{
//AGC memre
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if (ex != null)
{
error(ex.ToString());
}
else
error(AifUtil::getClrErrorMessage());
}
else
error(AifUtil::getClrErrorMessage());
//AGC memre
throw error("@SYS327400");
}
}
else
{
throw error(strFmt("@SYS106830", templateName));
}
}
else
{
try
{
workflowConfiguration = Microsoft.Dynamics.AX.Framework.Workflow.Model.WorkflowModel::Create(versionTable.ConfigurationId, curext(), domainUser);
}
catch (Exception::CLRError)
{
//AGC memre
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if (ex != null)
{
error(ex.ToString());
}
else
error(AifUtil::getClrErrorMessage());
}
else
error(AifUtil::getClrErrorMessage());
//AGC memre
throw error("@SYS327400");
}
}
}
public void run()
{
//AGC memre
#OCCRetryCount
System.Exception ex;
//AGC memre
try
{
modelEditorControl.Load(workflowConfiguration, userSettings);
workflowEditorPane.initializeActionPane();
if (element.args().openMode() == OpenMode::View)
{
isReadOnly = true;
modelEditorControl.set_IsReadOnly(true);
modifyElementButtonGroup.caption("@SYS322934");
modifyWorkflow.caption("@SYS322935");
viewToolboxButton.visible(false);
}
}
catch (Exception::CLRError)
{
//AGC memre
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if (ex != null)
{
error(ex.ToString());
}
else
error(AifUtil::getClrErrorMessage());
}
else
error(AifUtil::getClrErrorMessage());
//AGC memre
throw error("@SYS327400");
}
super();
}
Artık hata mesajını açıkça alabiliyordum:
Inbound portlara baktım, Windows güvenlik duvarını inceledim, Ax32Serv.exe.config dosyasını inceledim, hiçbirinde sorun görünmüyordu. Client configuration tool bir türlü WCF refresh yapamıyordu:
Her ne kadar bilgisayarda tek bir AOS olsa da Instance Name yazmayı denedim:
Sorun çözülmüştü: