1

私は SUDS と RPCLib を使用して、PDF ドキュメントを受け取り、PNG を返すソフトウェア ソリューションへの SOAP インターフェイスを開発してきましたが、非常に興味深い問題を発見しました。

テスト用のクライアント (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 トランスポート層の制限によるものだと感じていますが、これに対処する方法がわかりません。ありがとう!

4

2 に答える 2

2

許可されたリクエストの長さを増やすことができます。

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

Spyne 2.10 と 2.9.4 では、コンストラクターにこれらのパラメーターがあるため、次のようにするだけで済みます。

WsgiApplication(..., max_content_length=10 * 0x100000)
于 2013-02-10T11:07:20.953 に答える
0

可能な解決策を見つけました。これには、spyne ライブラリ [rpclib の後継] の更新と編集が含まれていました。

WSGI.py の関数 __wsgi_input_to_iterable() で、エラーをスローした 2 行をコメントアウトしました。

raise RequestTooLongError()

問題は、長さ = str(http_env.get('CONTENT_LENGTH', self.max_content_length)) から制限を引き出していることです。これは正しくないようです。

SPYNE 開発者に確認して、このバグの原因を確認します

于 2013-02-08T22:32:06.710 に答える