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

时间:2011-05-17 23:15:28

标签: suds

我很确定suds不会缓存我的WSDL和XSD like I expect it to。以下是我知道没有使用缓存对象的方法:

  1. 创建客户端大约需要30秒:client = Client(url)
  2. 记录器条目显示在整个30秒内一致消化XSD和WSDL文件
  3. Wireshark在整个30秒内向存储XSD和WSDL文件的服务器显示一致的TCP流量
  4. 每次运行程序时,我都会看到缓存中的文件正在更新
  5. 我有一个小程序,它创建一个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. 我认为可能在程序运行之间没有重用缓存,但我不认为如果是这样的话会使用文件缓存,因为内存缓存会做得很好< / LI>

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

1 个答案:

答案 0 :(得分:15)

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

以下是事件的顺序:

<强> 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 ...完成
  8. 因此保存新缓存文件并不重要,因为下次运行时会发生同样的事情。所有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)。