【问题标题】:No application is associated with the specified file for this operation没有应用程序与此操作的指定文件关联
【发布时间】:2013-09-11 22:26:23
【问题描述】:

我目前在我的 ASP MVC 站点的控制器方法中使用Process.start()。这是一个小型 Intranet 应用程序,因此我们设置的基本内容之外的安全性不是主要问题。

用户将能够输入附件的文件路径,即我们局域网上共享文件夹的位置。然后,当打开每个帐户的编辑页面时,该页面将显示指向附件的超链接。用户应该能够单击超链接并打开文件,而不是文件的副本或下载文件的副本,以便他们可以进行和保存编辑。

我的第一次尝试是创建以下ActionLink,将文件的位置发送到控制器。

<div class="M-editor-label" style="width: 400px;word-wrap: break-word;">
    @Html.ActionLink(Model.Attachment, "OpenAttachment", "BankListMaster", new { location = Model.Attachment }, new { @target = "_blank" })
</div>

然后控制器使用Process.Start() 像这样打开文件

    public void OpenAttachment(string location)
    {
        try
        {
            EventLog.WriteEntry("Monet", "Inside OpenAttachment |URL| " + location);

            Process proc = new Process();
            proc.StartInfo = new ProcessStartInfo(location);
            proc.Start();
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("Monet", ex.StackTrace);
        }
    }

当我在本地测试时这工作正常,但服务器没有安装 Office 的副本,所以我在 catch 块中收到此错误:

No application is associated with the specified file for this operation.  at 
System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at Monet.Controllers.BankListMasterController.OpenAttachment(String location) in 
C:\Projects\sym_Monet_INT\Monet\Controllers

谁能指出我正在使用的方法的修复方向或可以实现相同目标的更好方法的方向?

【问题讨论】:

  • 目标是什么?如果目标是在设备上打开文件,则设备需要有一个可以打开该文件的程序以及在注册表中与该文件关联的扩展名。为什么需要在服务器上打开这些文件?
  • 目标是打开用户计算机上的文件。上面的控制器代码是在服务器上运行的,所以服务器要么认为你试图打开服务器上的文件,要么不知道如何告诉用户的计算机使用什么程序来打开文件。
  • 从“本地工作良好的测试”中不清楚。

标签: c# .net asp.net-mvc asp.net-mvc-3 intranet


【解决方案1】:

Process.Start() 方法不适用于您要完成的任务。在服务器上运行的控制器不可能在最终用户的系统上启动进程。在测试中,这只是因为服务器和客户端恰好是同一台机器。在应用程序客户端运行的唯一代码是 Web 浏览器,而 Web 浏览器的唯一控制点是 JavaScript。您可以创建一个 JavaScript 函数,类似于以下内容:

<script type="text/javascript">
    function OpenFile(filePath) {
        var sh = new ActiveXObject("WScript.Shell");
        var fullFileName = "file://" + filePath;
        sh.run("\"" + fullFileName + "\"", 1);
    }
</script>

然后在按钮的 onclick 方法中调用它,如下所示:

<button onclick="OpenFile('c:/Users/UserName/Desktop/Test.txt');">Open</button>

然后您可以使用 Razor View 语法将按钮方法中的路径替换为适当的路径。另请注意,这使用 ActiveX,因此您需要确保客户端浏览器中允许使用 ActiveX。

【讨论】:

  • 不幸的是,这段代码在非 IE 浏览器中不起作用。我不熟悉ActiveXObject,你能推荐 Chrome 的替代品吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多