【问题标题】:Which processes are used by console application run from a web application从 Web 应用程序运行的控制台应用程序使用哪些进程
【发布时间】:2012-03-08 00:59:40
【问题描述】:

在网络应用程序中,当本地文件上传到服务器时,我需要执行文件转换(例如从 jpeg 到 pdf)。
我决定将此任务委托给控制台应用程序,以便将其与一般 Web 应用程序分离。每次用户上传本地文档时都会运行控制台应用程序代码,并在成功的情况下返回转换文件的名称(作为输入的 test.jpg 将返回为 test.pdf)。

由于在继续之前我需要知道文件是否已正确转换,我是否失去了将任务委托给外部进程的好处(因为控制台应用程序的代码将在单独的过程,对吧)?

由于上传的文件仅转换为 pdf 或 .doc,我可以相应地更改表示文件名的字符串,然后在以下步骤中最终检查该文件是否存在,但我想中断所有操作,如果转换失败,而不是产生任何应该丢弃的中间结果。

这里是我设计用来调用控制台应用程序的代码:

HttpPostedFile file = HttpContext.Current.Request.Files[0];
FileInfo fileInfo = new FileInfo(file.FileName);
string extension = fileInfo.Extension;
ConvertCommand conv = new ConvertCommand();
string convertedFile = conv.Run(file.InputStream, extension, targetFilePath);

【问题讨论】:

    标签: .net performance web-applications process console-application


    【解决方案1】:

    通常最好不要在 Web 请求的上下文中执行长时间运行的任务;文件转换可能是一项“长期运行”的任务。同步运行转换是问题所在,不一定是在代码隐藏、shell 应用程序或 Web 服务中运行代码。

    工作线程是 Web 服务器上的稀缺资源(相对而言);大多数 Web 服务器都希望在一秒钟左右的时间内处理 Web 请求。如果请求时间更长,服务器需要管理更多的工作线程;这反过来可能会减慢每个单独线程的处理速度,这意味着它们需要更长的时间,并且整个事情可能很快就会变成非线性的。

    正确的解决方案是使用asynchronous processing。只要您异步处理转换,我认为具体实现是什么并不重要 - 您遇到可伸缩性问题的可能性要小得多。为了获得额外的乐趣,如果必须将任务委托给单独的服务,您可以使用分布式处理。

    【讨论】:

    • +1 以获得好的提示。最初我的想法是使用异步解决方案并让控制台应用程序运行。但是,我需要知道转换是否失败才能继续工作流程。我将尝试解决方法将原始文件重命名为目标扩展名(pdf),然后在使用之前检查文件是否存在。但是问题是我可以在从控制台应用程序正确生成文件之前请求该文件,因为它会因为不可用而失败......
    【解决方案2】:

    我建议使用 Windows 服务进行图像转换,而不是控制台应用程序。可以通过 WCF 与它进行通信。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2014-01-24
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多