使用SUDS消费RPClib服务时可能存在消息大小限制?

1 投票
2 回答
1286 浏览
提问于 2025-04-17 14:14

我一直在用SUDS和RPCLib开发一个SOAP接口,这个接口可以把PDF文件转换成PNG图片,过程中遇到了一个很有意思的问题。

我写了一个测试客户端(用SUDS)和一个服务器端(用RPCLib),当上传和返回的文件小于大约3.5Mb时,它们都能正常工作。但是,当我上传更大的文件时,就出现了SUDS错误:

Traceback (most recent call last):
  File "MyFunc.py", line 90, in <module>
    callMyFuncSOAPService(fName, test_id, fNameOut)
  File "MyFuncClient.py", line 77, in callMyFuncSOAPService
    temp_list = client.service.createInstance(encoded_data, 19, test_id, 20)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 602, in invoke
    result = self.send(soapenv)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 637, in send
    reply = transport.send(request)
  File "/usr/local/lib/python2.7/dist-packages/suds/transport/https.py", line 64, in send
    return  HttpTransport.send(self, request)
  File "/usr/local/lib/python2.7/dist-packages/suds/transport/http.py", line 77, in send
    fp = self.u2open(u2request)
  File "/usr/local/lib/python2.7/dist-packages/suds/transport/http.py", line 118, in u2open
    return url.open(u2request, timeout=tm)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 32] Broken pipe>

而在返回文件时,服务器处理完毕并返回了文件,但客户端却卡住了。

我感觉这可能是因为HTTP传输层有某种限制,但我不知道该怎么解决。谢谢!

2 个回答

0

我找到了一种可能的解决办法。这涉及到更新和编辑spyne库(这是rpclib的后续版本)。

在WSGI.py文件中,__wsgi_input_to_iterable()这个函数里,我把导致错误的两行代码注释掉了:

raise RequestTooLongError()

问题在于,我们从length = str(http_env.get('CONTENT_LENGTH', self.max_content_length))这行代码中获取的限制似乎不正确。

我会联系SPYNE的开发者,看看这个错误可能是从哪里来的。

2

你可以简单地增加允许的请求长度。

app = WsgiApplication(...)
app.max_content_length = 10 * 0x100000 # 10 MB

Spyne 2.10 和 2.9.4 版本在构造函数中会有这些参数,所以你只需要这样做:

WsgiApplication(..., max_content_length=10 * 0x100000)

撰写回答