使用SUDS消费RPClib服务时可能存在消息大小限制?
我一直在用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)