代码改变世界

【随】Silverlight请求服务的缓存文件问题

2010-03-06 17:23  拖鞋不脱  阅读(1409)  评论(1编辑  收藏  举报

问题描述

用Silverlight和WCF做上传图片,结果图片上传一半就报了错,然后屏幕右下角弹出“磁盘空间不足”的警告,发现C盘竟然只剩下十几兆的空间了。刷新一下页面,C盘空间又恢复了原来的大小(1G左右)。

问题原因

经过一番检查,发现Silverlight在调用Web服务的时候,每个请求都会在系统盘生成临时文件(在Win7下,位置是C:\Users\用户名\AppData\Local\Temp\),临时文件以XCP做前缀,然后跟以一串4位数字,并且每个临时文件都是20M

image

而且只有当网站部署在IIS中通过IE内核的浏览器浏览时才会出现这种情况,非IE内核浏览器或者网站在VS中都不会生成相应的临时文件。

考虑20M和在ServiceReferences.ClientConfig中默认设置的

maxBufferSize="2147483647"  maxReceivedMessageSize="2147483647"

大小上是一致的,所以尝试改变了一下这两个数值(要求必须一致),但临时文件的大小并没有改变。

所以导致临时文件产生的根本原因并没有找到,而且怀疑这就是Silverlight的一个Bug……平视没有注意到是因为请求不频繁,而且临时文件会在一定时间后自动清除,但由于图片上传将图片分成了很多小份,每一份都会调用一次服务,而原有的临时文件又没有很快清除,所以1G的空间很快就被吃掉了。

解决办法

通过Google大神,查到有同样问题的仁兄:

Silverlight 3 creates a lot of XCP temp files (20MB each)

http://www.anythingtheycando.com/blog/index.php/2010/02/02/silverlight-temp-file-issue/ (需翻)

找到了解决这一问题的办法:

在每个服务请求的回调函数中调用GC.Collect();强制清除这一缓存文件。事实上我也不是很明白GC.Collect()为什么会回收这种临时文件垃圾……谁让咱连它怎么产生的都不知道呢。

虽说GC.Collect()对性能会产生影响,但为了程序正常运行计,也不得不如此了,但愿Silverlight4能解决这一问题。