如何背景时间/ IO耗时跨防火墙的操作在ASP.NET C#

问题描述:

摘要
我们有一个ASP.NET应用程序,允许用户通过一个中间层查询SQL Server数据库(相当标准的东西) 。当用户尝试为返回给他们的行生成PDF时。每一组具有共同标识符的行将“转入”PDF中的单独页面。
如何背景时间/ IO耗时跨防火墙的操作在ASP.NET C#

本来,我认为行数将是一个数量级,有利于将最终的PDF传输到ASP响应流,并让用户将文件下载到他们的机器中,但是更新的要求表明行数非常大,并且大大超出了我设计的范围。

我目前的解决方案如下:

  1. 如果返回的行数是大于配置threshold值越大,用户得到,询问他们是否要生成的PDF格式的一条消息背景并在完成后通过电子邮件通知URL,以便他们可以下载它们。

  2. 如果用户可以接受,我创建两个DataTable s:一个包含实际数据,另一个包含MetaData,例如保存生成的PDF,名称和其他元类型信息的位置。

  3. 然后,我可以使用DataTable.WriteXML在特定文件夹中生成“作业”文件。

  4. 这是全部在一个单独的线程中完成的,因此用户可以继续做他们想做的事情。

问题
我真的想一台机器上工作的XML文件存储在我们的防火墙(共享的网络文件夹)中,但似乎我不能出于安全原因。我被告知我可能想要使用模拟并已尝试但无法使其工作。

该应用程序的其他部分是“监听”到“输入”文件夹,并每小时(或类似计划)处理这些“作业”文件一次,将生成的PDF文件移动到必要的位置,向用户发送电子邮件。

我已经获得了读取作业文件并生成PDF的部分,并且创建作业文件的部分有效(当我在防火墙内部运行时),但是当我在防火墙外部运行它时,即使尝试模仿, 这是行不通的。 (口口声声说“网络位置找不到”

问题(S):??
我要对这个正确的方式
如何编写跨防火墙这些文件
的任何设计思路或建议?

在此先感谢。

+0

防火墙的哪一边是SQL Server/Web服务器? (我假设它在外面?) – realworldcoder 2010-10-31 21:02:15

+0

SQL Server位于防火墙内。 – funkymushroom 2010-11-01 16:04:47

我如何解决这个问题,是在我们的数据库上创建一个名为PDFJobs的表格。

此表包含用于运行报告还有所需的模板文件夹文件,在目标文件夹为生成的PDF的标准。

然后,我编写了一个命令行工具(PDFGenerator),它从该表中读取,并为每一行创建一个执行PDF生成的单独线程。生成PDF后,它会将电子邮件发送到电子邮件地址(也包含在表中)。

然后,我有一个Windows计划的任务,它运行那个PDFGenerator工具每小时。
这并不是主意,但它完成了这项工作。

最近的一次更新是,他们希望在创建工作行时触发PDFGenerator ......我想我将不得不多做一些关于这一点的思考。

你至少可以做HTTP通过防火墙?如果不创建一个XML文件,但调用web服务是在防火墙内。Idealy,该Web服务将不是创建一个XML文件,但我nstead将数据放入消息队列中。 MSMQ在这里很有用。 然后,PDF生成器会从这个队列中读取XML。 通过这种方式,您不会遇到发生器拾取尚未完成的文件的情况。而且您不会浪费时间和资源轮询文件。

希望这会有所帮助。

+0

这是一个不错的主意,我会尝试并让你知道。 – funkymushroom 2010-11-01 16:05:28

+0

听到这个很高兴。如果你想让它变得真实,请看看WCF。 WCF可以很好地写入和读取msmq队列。 – 2010-11-01 20:30:14

+0

尽管我想让它看起来很时尚,但时间限制和管理注意力仍然受到限制。由于各种原因,我没有被允许使用MSMQ,其中之一就是我们有另一种大量使用MSMQ的工具,任何对MSMQ的使用都将被视为潜在的影响。我用另一种方式解决了这个问题,我将在下面详细介绍。 – funkymushroom 2010-11-09 18:09:37