如何解决此错误“ System.ServiceModel.FaultException”

时间:2018-10-26 02:31:33

标签: c# acumatica

每次我停止程序并再次运行时都会弹出错误消息

  

PX.Data.PXException:API登录限制      在PX.Api.ContractBased.Soap.WebApiSoapController.Post(ISoapSystemContract systemContract,XmlReader requestReader,字符串serviceNamespace,字符串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()   ---从之前引发异常的位置开始的堆栈结束跟踪---      在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()   ---从之前引发异常的位置开始的堆栈结束跟踪---      在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()

这是我登录时的代码

...
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 :(得分:1)

未经许可的演示版本具有数量有限的API连接会话。

您必须确保在登录后总是 调用注销,否则您将耗尽可用的连接会话。对于非许可版本,您应该随时争取最多1个连接,并确保不执行API连接会话注销就无法停止应用程序。

这是我用来确保的策略:

  • 仅使用单线程代码与API交互,因为您 要避免在使用未许可的情况下避免多个并发连接 版本。

  • 将所有与API交互的代码包装在异常块中,该代码将 始终调用注销。在这里被偏执并没有什么害处,您可以将登录代码放到try块中,因为如果登录失败,则尝试注销没有任何危害。

  • 请尽量缩短会话时间,切记,请勿登录 抢先或保持连接打开的时间超出要求。 会话闲逛时间过长会增加 在发出注销命令之前断开连接,或者 只是忘记注销。

  • 注册一个应用程序范围的OnClose事件处理程序以注销该 用户软关闭应用程序时的会话。如果用户硬关闭应用程序(例如:通过使用任务管理器将其杀死),则无法执行注销,因此必须等待会话到期或重新启动IIS,以避免超出API连接限制错误。

  • 将每个连接登录/注销尝试记录到磁盘(是否成功) (或否),以确保每次登录时始终调用注销。什么时候 执行登录后,为该连接创建一个唯一的ID并进行记录, 执行注销时,使用相同的唯一ID对其进行记录。如果你得到 再次出现API限制错误,您将获得日志数据以确认是否 不是您已成功注销所有打开的会话。