处理API调用操作上的Acumatica超时

处理API调用操作上的Acumatica超时,acumatica,Acumatica,我在一个独立的应用程序中有调用Acumatica操作生成报告的代码;在操作完成时,我在大型文档上遇到超时 处理这些超时的最佳方法是什么?我需要等待操作完成,以便检索我生成的文件 独立应用程序代码: public SalesOrder GenerateAcumaticaLabels(string orderNbr, string reportType) { SalesOrder salesOrder = null; using (ISoapClientPro

我在一个独立的应用程序中有调用Acumatica操作生成报告的代码;在操作完成时,我在大型文档上遇到超时

处理这些超时的最佳方法是什么?我需要等待操作完成,以便检索我生成的文件

独立应用程序代码:

public SalesOrder GenerateAcumaticaLabels(string orderNbr, string reportType)
    {
        SalesOrder salesOrder = null;
        using (ISoapClientProvider clientProvider = soapClientFactory.Create())
        {               
            try
            {
                SalesOrder salesOrderToFind = new SalesOrder
                {
                    OrderType = new StringSearch { Value = orderNbr.Split(OrderSeparator.SalesOrder).First() },
                    OrderNbr = new StringSearch { Value = orderNbr.Split(OrderSeparator.SalesOrder).Last() },
                    ReturnBehavior = ReturnBehavior.OnlySpecified,
                };

                salesOrder = clientProvider.Client.Get(salesOrderToFind) as SalesOrder;                   

                InvokeResult invokeResult = new InvokeResult();                 
                invokeResult = clientProvider.Client.Invoke(salesOrder, new exportSFPReport());
                ProcessResult processResult = clientProvider.Client.GetProcessStatus(invokeResult);
                //Wait for the update to complete before we attempt to retrieve the files
                while (processResult.Status == ProcessStatus.InProcess)
                {
                    Thread.Sleep(1000); //pause for 1 second
                    processResult = clientProvider.Client.GetProcessStatus(invokeResult);
                }
            }
针灸的作用:

    public PXAction<SOOrder> ExportSFPReport;
    [PXButton]
    [PXUIField(DisplayName = "Generate Robot SFP PDF")]
    protected IEnumerable exportSFPReport(PXAdapter adapter)
    {
        //Report Paramenters
        Dictionary<String, String> parameters = new Dictionary<String, String>();
        parameters["SOOrder.OrderType"] = Base.Document.Current.OrderType;
        parameters["SOOrder.OrderNbr"] = Base.Document.Current.OrderNbr;

        IEnumerable reportFileInfo = ExportReport(adapter, "IN619217", parameters);
        exportTrayLabelReport(adapter, "SFP");
        return reportFileInfo;
    }
public PXAction ExportSFPReport;
[按钮]
[PXUIField(DisplayName=“生成机器人SFP PDF”)]
受保护的IEnumerable ExportsPreport(PXAdapter适配器)
{
//报告参数
字典参数=新字典();
参数[“SOOrder.OrderType”]=Base.Document.Current.OrderType;
参数[“SOOrder.OrderNbr”]=Base.Document.Current.OrderNbr;
IEnumerable reportFileInfo=ExportReport(适配器,“IN619217”,参数);
exportTrayLabelReport(适配器,“SFP”);
返回reportFileInfo;
}

我认为您遇到超时的原因是,在发送请求和接收响应之间没有TCP通信。当TCP KeepAlive标志设置为true时,客户端将定期ping服务器以重置超时时间

那将是最好的办法。然而,针灸连接是相当高的水平,所以我不认为你能够轻松访问该标志。在不涉及外部应用程序的场景中,我首先尝试的是将动作事件处理程序代码包装在PXLongOperation块中,该块必须执行类似的操作,以保持连接处于活动状态:

PXLongOperation.StartOperation(this or Base, delegate
{
    your code here
});
当我在Acumatica中遇到无法用PXLongOperation解决的超时时,我会选择最简单的方法,即在
Web.Config
文件中增加IIS超时。我不确定您的外部应用程序用例是否适合异步PXLongOperation。处理程序将过早返回,客户端无法检索异步负载

因此,您可能需要增加超时时间。据我所知,除非你的网站受到拒绝服务攻击的威胁,否则这样做并没有实际的缺点

如果您是自托管Acumatica,则可以使用
inetmgr
程序查找和编辑Acumatica实例的
Web.Config
文件。否则,请与您的SAAS联系人联系,看看这是否是一种选择

我很确定你正在进入IIS超时状态。故障指示灯将在5分钟后失去连接,这是默认的300秒值。您可以编辑Web.Config文件以增加
executionTimeout
值。如果您正在从Acumatica API请求大量数据,那么增加
maxRequestLength
也不是一个坏主意,因为这也是您在测试中遗漏的常见故障原因,并且在实际场景中会发生:

<httpRuntime executionTimeout="300" requestValidationMode="2.0" maxRequestLength="1048576" />


这里的问题是您的操作是同步的,因此它试图在
调用中完成(这对于长流程来说不是一件好事)。您必须通过在处理程序中使用显式地使您的操作长期运行,然后您的客户机代码应该能够正常工作,因为它已经处理了等待和检查。

您何时获得超时?什么是
exportSFPReport
方法-一个动作处理程序?意识到我在剪切和粘贴中遗漏了几行;编辑了上述代码。是的,它是一个操作处理程序。建议使用PXLongOperation.startoOperation将您的操作包装为Long operation,正如@SergRogovtsev所说的那样。在其他情况下,您也可以在浏览器中获取超时。那么,GetProcessStatus将跟踪长操作何时完成?在生成报告之前,我无法继续使用我的应用程序代码。是的,
GetProcessStatus
将根据操作状态返回不同的状态,当您“完成”时,您可以继续。