6

我很确定 suds 没有像我期望的那样缓存我的 WSDL 和 XSD 。以下是我知道没有使用缓存对象的方法:

  1. 创建客户端大约需要 30 秒:client = Client(url)
  2. 记录器条目显示在整个 30 秒内对 XSD 和 WSDL 文件的一致消化
  3. Wireshark 在整个 30 秒内向存储 XSD 和 WSDL 文件的服务器显示一致的 TCP 流量
  4. 每次运行程序时,我都会看到缓存中的文件正在更新

我有一个小程序,它创建一个 suds 客户端,发送一个请求,获取响应,然后结束。我的期望是每次我运行程序时,它都应该从文件缓存中获取 WSDL 和 XSD 文件,而不是从 URL 中获取。这就是我认为的原因:

  1. client.options.cache.duration设定为('days', 1)
  2. client.options.cache.location设置为c:\docume~1\mlin\locals~1\temp\suds,我每次运行程序时都会看到正在生成和重新生成的缓存文件
  3. 有那么一刻,我想也许在程序运行之间没有重用缓存,但我认为如果是这种情况,就不会使用文件缓存,因为内存缓存就可以了

我是否误解了 suds 缓存应该如何工作?

4

1 回答 1

16

问题出在 suds 库本身。在 cache.py 中,虽然ObjectCache.get()总是获得一个有效的文件指针,但它在执行pickle.load(fp). 发生这种情况时,该文件将再次下载。

以下是事件的顺序:

DocumentReader.open():

  1. 尝试http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
  2. 加载 ObjectCache 51012453-document
  3. 正在加载腌制对象...
  4. 引发异常:
  5. 没有从缓存中获取
  6. 正在下载...完成
  7. 保存 FileCache 51012453-document... 完成

所以保存新的缓存文件并不重要,因为下次运行时会发生同样的事情。这发生在所有 WSDL 和 XSD 文件上。

我通过在读写时以二进制模式打开缓存文件来解决这个问题。具体来说,我所做的更改在 cache.py 中:

1) 在FileCache.put()中,更改这一行:

f = self.open(fn, 'w')

f = self.open(fn, 'wb')

2) 在FileCache.getf()中,更改这一行:

return self.open(fn)

return self.open(fn, 'rb')

我不太了解代码库,无法知道这些更改是否安全,但它正在从文件缓存中提取对象,服务仍在成功运行,并且加载客户端的时间从 16 秒下降到 2.5 秒。如果你问我会更好。

希望这个修复或类似的东西可以被引入到 suds 主线中。我已经将它发送到了 suds 邮件列表(redhat dot com 上的 fedora-suds-list)。

于 2011-07-22T18:27:41.830 回答