Как я могу решить эту ошибку "System.ServiceModel.FaultException" - PullRequest
0 голосов
/ 26 октября 2018

Каждый раз, когда я останавливаю программу и снова запускаю сообщение об ошибке pop

PX.Data.PXException: ограничение входа API в PX.Api.ContractBased.Soap.WebApiSoapController.Post (ISoapSystemContract systemContract, XmlReader системы)requestReader, String serviceNamespace, String internalNamespace, метод MethodInfo, Func 1 serviceFactory, IEdmModel edmModel) at PX.Api.ContractBased.Soap.WebApiSoapController.<Login>d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3 1.MoveNext () --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () вSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в SystemR.ExceptionServices.При возникновении исключения --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Controllers.Exceptiond0__ (исключение).

это мой код при входе в систему

...
using (DefaultSoapClient soapClient = new DefaultSoapClient())
{
       //Log in to Acumatica ERP        
       soapClient.Login
       (
            Properties.Settings.Default.UserName,
            Properties.Settings.Default.Password,
            Properties.Settings.Default.CompanyName,
            Properties.Settings.Default.Branch,
            null
       );
 ...
      try
      {
           ...
           soapClient.Logout();
      }
      catch (Exception e)
      {
           ...
           soapClient.Logout();
      }
      finally
      {
           ...
      }

что не так с моим кодом и как его исправить?

1 Ответ

0 голосов
/ 26 октября 2018

Нелицензированные демо-версии имеют ограниченное количество сеансов подключения API.

Вы должны убедиться, что Logout всегда вызывается после входа в систему, в противном случае у вас закончатся доступные сеансы подключения.Для нелицензионной версии вы должны стремиться к максимум 1 соединению в любое время и убедиться, что приложение не может быть остановлено без выполнения выхода из сеанса соединения API.

Вот состояние, которое я хотел бы использовать, чтобы:

  • Используйте только однопоточный код для взаимодействия с API, потому что вы хотите избежать нескольких одновременных подключений при использовании нелицензионной версии.

  • Оберните весь код, взаимодействующийс API в блоке исключений, который всегда будет вызывать выход из системы.Здесь не помешает быть параноиком, вы можете поместить код входа в блок try, потому что при неудачном входе попытка выхода из системы не причинит вреда.

  • Попробуйте сделать сеансКороче говоря, не входите в систему превентивно и не открывайте соединение дольше, чем требуется.Слишком длительное зависание сеансов увеличивает вероятность потери соединения, прежде чем вы сможете выполнить команду выхода из системы или просто забыть выйти из системы.

  • Зарегистрируйте обработчик события OnClose в приложении для выхода из системы.сеанс, когда пользовательский софт закрывает приложение.Если пользователь принудительно закрывает приложение (например, убив его с помощью диспетчера задач), вы не сможете выполнить выход из системы, поэтому вам придется ждать истечения сеанса или перезапустить IIS, чтобы избежать ошибок превышения лимита подключения API.

  • Записывать каждое соединение / вход / выход из системы на диск (независимо от того, успешно или нет), чтобы убедиться, что он всегда вызывает выход из системы для каждого входа.Когда вход в систему выполнен, создайте уникальный идентификатор для этого соединения и зарегистрируйте его, при выходе из системы зарегистрируйте его с тем же уникальным идентификатором.Если вы снова получите ошибку ограничения API, у вас будут данные журнала для подтверждения успешного выхода из всех открытых сеансов.

...