虽然我期望它,但是并没有重用缓存的WSDL和XSD

Mik*_*Lin 6 suds

我很确定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缓存应该如何工作?

Mik*_*Lin 16

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

这是事件的顺序:

DocumentReader.open():

  1. 试用http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
  2. 加载ObjectCache 51012453文档
  3. 加载腌制对象......
  4. 提出例外:
  5. 缓存中没有
  6. 正在下载...完成
  7. 保存FileCache 51012453-document ...完成

因此保存新缓存文件并不重要,因为下次运行时会发生同样的事情.所有WSDL和XSD文件都会发生这种情况.

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

1)在FileCache.put(),更改此行:

f = self.open(fn, 'w')
Run Code Online (Sandbox Code Playgroud)

f = self.open(fn, 'wb')
Run Code Online (Sandbox Code Playgroud)

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

return self.open(fn)
Run Code Online (Sandbox Code Playgroud)

return self.open(fn, 'rb')
Run Code Online (Sandbox Code Playgroud)

我不知道代码库是否足以知道这些更改是否安全,但它从文件缓存中提取对象,服务仍然成功运行,并且加载客户端从16秒下降到2.5秒.如果你问我,好多了.

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

  • 我从邮件列表中收到了反馈.我们甚至在BitBucket的一个分支中进行了修复(之后被删除),但是这些更改从未被引入项目中.随意重新提交.请点击此处的电子邮件主题:http://lists.fedoraproject.org/pipermail/suds/2011-July/001481.html (2认同)