Skip to main content

.NET Business Connector Session Terminated

You were right, that RPC error is of no use, the key was that the session was lost.
I can reproduce the error:
- I start my .NET windows service that uses the BC.NET
- go to AX - Adminstration - Online users
- terminate the BC.NET user sessions
- execute an action that triggerd my service to use the BC.NET

What I then did, is add a try/catch to my service, and a loop so I could reconnect to AX with the BC in case the error occurred.

Like this:

public void DoSmth()
{
int retryCount = 1; while (retryCount >= 0)
{
try { object o = axapta.CallStaticClassMethod("DAXClass", "DAXMethod", "parameter"); break;
}
catch (Exception ex)
{
if (retryCount < 0)
{
logger.Error(ex.Message);
}
else {
logger.Debug(
"Retry. Recreating connector instance");
axapta = new Axapta(); this.Login();
retryCount--;
}
}
}
}


The login method looks like this (logger is log4net object):

private void Login()
{
try {
axapta.Logon(
null, null, null, null); } catch (Exception ex)
{
logger.Error(ex.Message);
}
}


I'm no .NET expert, but that code worked for me.

Thx for the assistance,
I hope this helps others too.

Best regards,
Klaas.

==========
I found the solution to my particular problem. I doubt it applies to you tho Klaas, there are probably much more common causes of this error.

I was using imersonation when initiating the connection to AX, then reverting it. This is a common partern that works for SQL. Using AX4, this seems to intermittently fail with the “Server has terminated the session” error (AX5 is fine). I stopped using impersonation and it has been working without any issues.

===========
We faced the similar issue in AX 2009 (ax 5.0). Restarting the SQL services fixed the issue but would like to understand the core cause for the same. Any relevant guidance would help. Thank you.

Popular posts from this blog

Dynamics Axapta: Sales Orders & Business Connector

Well, again folllowing my same idea of writting close to nothing and pasting code, I'll paste in some code to create a sales order from some basic data and the invoice it. I'll try to explain more in the future. AxaptaObject axSalesTable = ax.CreateAxaptaObject("AxSalesTable"); AxaptaRecord rcInventDim = ax.CreateAxaptaRecord("InventDim"); AxaptaRecord rcCustTable = ax.CreateAxaptaRecord("CustTable"); rcCustTable.ExecuteStmt("select * from %1 where %1.AccountNum == '" + MySalesOrderObject.CustAccount + "'"); if (MySalesOrderObject.CurrencyCode.Trim().Length == 0) MySalesOrderObject.CurrencyCode = rcCustTable.get_Field("Currency").ToString().Trim(); string sTaxGroup = rcCustTable.get_Field("taxgroup").ToString().Trim(); //set header level fields axSalesTable.Call("parmSalesName", MySalesOrderObject.SalesName.Trim()); axSalesTable.Call("parmCustAccount", M

Passing values between form and class

Class name is EmplDuplication and Form is EmplTable . void clicked() {    MenuFunction mf;    args args = new Args();    ;     args.record(EmplTable);     mf = new menufunction(identifierstr(EmplDuplication), MenuItemType::Action); mf.run(args); } Meanwhile, in the main() method of the EmplDuplication class, we need to put this Axapta x++ code to get the datasource: static void main(Args args) {     EmplDuplication EmplDuplication; EmplTable localEmplTable; ;     if(args.record().TableId == tablenum(EmplTable)) localEmplTable = args.record();     ... }