Worklight 5.0.6:Ajax 请求异常:向数据适配器发送大数据时表单太大

Posted

技术标签:

【中文标题】Worklight 5.0.6:Ajax 请求异常:向数据适配器发送大数据时表单太大【英文标题】:Worklight 5.0.6 : Ajax request exception: Form too large while sending large data to data adapter 【发布时间】:2013-08-21 09:39:58 【问题描述】:

我的问题与 developerworks 论坛上发布的问题相对相同(论坛因迁移而只读),即:

我有一个与外部 Web 服务接口的 http 适配器。部分 有效载荷是音频和图像。我们达到了表单大小限制。 请参阅本文末尾附加的例外情况。我继续阅读 码头配置需要调整到的以前的帖子 容纳更大的有效载荷。我们想控制这个大小限制 服务器端应用程序层,并认为创建一个 jetty-web.xml 定义最大表单大小:

400000

在 Worklight 中,这是解决此问题的正确方法吗?

如果这是正确的方法,您能否提供详细信息 jetty-web.xml 应该放在 server/conf 下,还是需要 是在应用大战的WEB-INF下吗?

如果文件需要放在WEB-INF下,你能解释一下如何 完成在 WL 项目期间放置在 WEB-INF 下的这个文件 构建。

感谢 E:Ajax 请求异常:Form too large802600>200000 2013-02-06 11:39:48 FWLSE0117E:错误代码:1,错误描述: INTERNAL_ERROR,错误消息:FWLSE0069E:发生内部错误 在小工具请求期间表格太大802600>200000,用户身份 wl_authenticityRealm=null,GersServiceAdapterRealm=(名称:USAEMP4, loginModule:GersServiceAdapterLoginModule), wl_remoteDisableRealm=(名称:NullLoginModule, loginModule:NullLoginModule), SampleAppRealm=null, wl_antiXSRFRealm=(名称:antiXSRF, loginModule:WLAntiXSRFLoginModule), wl_deviceAutoProvisioningRealm=null,WorklightConsole=null, wl_deviceNoProvisioningRealm=(名称:设备, loginModule:WLDeviceNoProvisioningLoginModule), 我的服务器=(名称:3e857b6a-d2f6-40d1-8c9c-10ca1b96c8df, loginModule:WeakDummy), wl_anonymousUserRealm=(名称:3e857b6a-d2f6-40d1-8c9c-10ca1b96c8df, loginModule:WeakDummy).

我也有同样的问题: 我将大量数据发送到工作灯适配器,但我的应用程序失败并在日志中显示以下错误消息:

2013-08-21 09:48:17] FWLSE0020E: Ajax request exception: Form too large202534>200000
[2013-08-21 09:48:18] FWLSE0117E: Error code: 1, error description: INTERNAL_ERROR, error message: FWLSE0069E: An internal error occurred during gadget request Form too large202534>200000, User Identity wl_authenticityRealm=null, wl_remoteDisableRealm=(name:null, loginModule:NullLoginModule), SampleAppRealm=null, wl_antiXSRFRealm=(name:b2isf3704k2fl8hovpa6lv9mig, loginModule:WLAntiXSRFLoginModule), wl_deviceAutoProvisioningRealm=null, WorklightConsole=null, wl_deviceNoProvisioningRealm=(name:40a24da9-0a32-464a-8dec-2ab402c683ae, loginModule:WLDeviceNoProvisioningLoginModule), myserver=(name:2b1a7864-37c4-47f0-9f5c-49621b6915b5, loginModule:WeakDummy), wl_anonymousUserRealm=(name:2b1a7864-37c4-47f0-9f5c-49621b6915b5, loginModule:WeakDummy).

这发生在通过调用 WL.Client.invokeProcedure(...) 并在被调用过程的第一行之前调用适配器过程...如果我尝试记录被调用过程的开始,我没有写入任何内容我的调试日志...

我可以给你我的源代码:

这个被一个 dhtml 用户事件(onclick)调用:

// Construct the param to pass to the WL adapter insert procedure
var paramObject = 
    QCDART: machine,                    // machine is a javascript variable as long int
    QTITRE: title,                      // title is a javascript variable as string(255)
    QDESC: desc,                        // desc is a javascript variable as string(255)
    QHODAT: todayDateDb2IntFormat,      // todayDateDb2IntFormat is a javascript variable as long int
    QACTIF: active,                     // active is a javascript variable as int
    s-s-rCFIC: currentPdfFileDataBase64,  // currentPdfFileDataBase64 is a javascript variable as base64 encoded string from a binary file > 150 ko approx.
    SMIMFIC: 'application/pdf',         
    SSIZFIC: currentPdfFileSize         // currentPdfFileSize is a javascript variable as long int
;

// Construct adapter invocation data
var invocationData = 
    adapter : 'IseriesDB2Backend', // adapter name
    procedure : 'addModeleReleves', // procedure name
    parameters : [paramObject] // parameters if any
;

WL.Client.invokeProcedure(invocationData, 
    timeout: 60000,
    onSuccess: function() 
        // Notify success
        alert('OK');
    , // invokeProcedure success callback
    onFailure: function(invocationResult) 
        alert('ERROR');
     // invokeProcedure failure callback
);

这是我的适配器源代码:

var addModeleReleveStatement = WL.Server.createSQLStatement("select QCDDOC from FINAL TABLE (insert into ERIHACFICH.DOCENTQ (QCDART, QTITRE, QDESC, QHODAT, QACTIF) values (?, ?, ?, ?, ?))");
function addModeleReleves(params) 
    WL.Logger.debug('Starting adapter procedure...');

    var modeleReleveResult =  WL.Server.invokeSQLStatement(
        preparedStatement : addModeleReleveStatement,
        parameters : [params.QCDART, params.QTITRE, params.QDESC, params.QHODAT, params.QACTIF]
    );

    if(modeleReleveResult.isSuccessful) 
        WL.Logger.debug('Success !');
    

    WL.Logger.debug('Adapter procedure ended !');

    // Return result (with the last id inside)
    return modeleReleveResult;

如果名为 currentPdfFileDataBase64 的 javascript 变量很小,则一切正常,但如果它超过大约 200000 个字符长度,则会失败...

最后,我可以说问题出现在开发环境(WL Studio 5.0.6 + WL Server 5.0.6),我没有在基于SLES + Websphere应用服务器7 + worklight的生产环境上测试。

感谢您的帮助

【问题讨论】:

你试过适配器了吗? 是的,我使用 WLStudio 向导生成的 sql 适配器 【参考方案1】:

我了解到您使用的是 Worklight 提供的测试服务器。

看起来这是 Jetty 的限制,因此您可以尝试以下任何一种:

1) 将系统属性 org.eclipse.jetty.server.Request.maxFormContentSize 设置为更大的值(即添加 -Dorg.eclipse.jetty.server.Request.maxFormContentSize=25000000)到 eclipse.ini 之前的末尾启动 Worklight。

2) 而是将这个其他系统属性 -Dorg.mortbay.jetty.Request.maxFormContentSize=25000000 设置为相同的位置。

【讨论】:

我忘了说,但这是服务器端配置,因此生产服务器可能会应用不同的配置(因为它不会是Jetty) 感谢您的回答,您的信息是正确的,当您说它在生产中有所不同时,因为在生产中的 WAS 7 + WL5.06 下不会出现此问题 您介意将您的问题设置为已回答吗?谢谢【参考方案2】:

解决问题的另一种方法是使用不再使用 Jetty 作为测试环境的 WL Studio 版本 6

【讨论】:

以上是关于Worklight 5.0.6:Ajax 请求异常:向数据适配器发送大数据时表单太大的主要内容,如果未能解决你的问题,请参考以下文章

在 Worklight 中构建和部署失败并出现 openjpa 致命一般错误

IBM Worklight 5.0.6.1 - 使用加密的 worklight.properties 文件保护 Worklight 控制台

IBM Worklight 5.0.6 - 在哪里可以找到 5.0.6 存储库?

Worklight 5.0.6 Dojo 代码迁移

Worklight HTTP 适配器与 Ajax 请求

IBM Worklight 5.0.6.1 - 通过代理服务器推送通知