处理API调用操作上的Acumatica超时
我在一个独立的应用程序中有调用Acumatica操作生成报告的代码;在操作完成时,我在大型文档上遇到超时 处理这些超时的最佳方法是什么?我需要等待操作完成,以便检索我生成的文件 独立应用程序代码:处理API调用操作上的Acumatica超时,acumatica,Acumatica,我在一个独立的应用程序中有调用Acumatica操作生成报告的代码;在操作完成时,我在大型文档上遇到超时 处理这些超时的最佳方法是什么?我需要等待操作完成,以便检索我生成的文件 独立应用程序代码: public SalesOrder GenerateAcumaticaLabels(string orderNbr, string reportType) { SalesOrder salesOrder = null; using (ISoapClientPro
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
将根据操作状态返回不同的状态,当您“完成”时,您可以继续。