调用服务来处理大文件

时间:2013-01-14 21:03:58

标签: c# wcf

所以我有这个WCF服务,为我提供PDF处理功能。现在它接受并返回普通字节数组(byte[]),但这意味着它总是将所有内容读取到内存中,即使它处理流,它也必须将ToArray()它们转换为字节数组。问题是,这导致内存不足问题和堆碎片。

我有两种选择来优化它,因此它不会占用太多内存:

  • 使用流。虽然很诱人,但我可能不得不将它保存到磁盘上以便由PDF工具包处理。鉴于绑定数量有限以及对双工流和参数数量的限制,这也是一个非常挑剔的策略。
  • 来回传递UNC文件路径。似乎很有希望,但因为有人需要在使用后清理文件。

哪种替代方案可以在优化资源使用(内存,网络,文件系统)方面取得最佳效果?

2 个答案:

答案 0 :(得分:3)

这是旧学校,但我会选择“来回传递UNC文件路径”。幸运的是,我们的开发人员已经有了几年的这种方法的经验(参见:1980年左右的Unix版本7中的print spooler)。

答案 1 :(得分:2)

我也会选择 UNC文件路径选项。我通过Application Server将用户上传的文件从Web服务器传输到SharePoint时使用了这个。 Web服务器会将文件路径传递给App Server,然后App Server将获取文件并将其加载到SP中。通过从Web服务器到App Server的Web服务调用将文件作为字节数组传递是一个更好的选择。

如果您担心自己的服务可能无法进行清理,请注意“某人需要在之后清理文件”,例如如果有异常,您可以随时制定备份计划并使用简单的功能,例如带有计划任务的powershell脚本,以删除本应删除的旧文件。

要考虑的一件事是文件名冲突的可能性。在我们的例子中,两个用户可以上传具有相同名称的单独文件,因此我们必须确保将正确的文件放入正确的SP文件夹中。我们通过在本地存储文件的Web服务器解决了这个问题,使用GUID名称重命名文件,然后将新名称传递给App Server。原始文件名作为元数据发送到App Server,以便在加载到SP之前将文件重命名为其原始名称。