【问题标题】:ASP .NET On_Load method not executingASP .NET On_Load 方法未执行
【发布时间】:2017-11-20 16:46:33
【问题描述】:

我正在开发一个在本地工作的 kludge,但在我将其部署到我们的服务器后却没有。

我有一个网页打开,运行EXE,然后关闭网页。这在本地有效,但在发布到服务器后,EXE 不会运行。我已确认文件路径在服务器上有效。

我的网页代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EmailSignature_EXEC.aspx.cs" Inherits="_Default" %>

<html>
<head>
    <title></title>
<script>
function loaded()
{
    window.setTimeout(CloseMe, 500);
}

function CloseMe() 
{
    window.open('', '_self').close();
}
</script>
<script type="text/javascript">
</script>
</head>
<body onLoad="loaded()">
Hello!
    \\\\cmbfs02\\Software\\web\\EmailSignature_WPF\\EmailSignature_WPF.exe
</body>
</html>

C#代码:

using System.Diagnostics;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load()
    {
        var applicationPath = "\\\\cmbfs02\\Software\\web\\EmailSignature_WPF\\EmailSignature_WPF.exe";
        Process.Start(applicationPath);
        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Close", "window.close()", true);
    }
}

当我在IIS 上浏览到我的页面时,我看到该页面在Timeout 之后出现并关闭,但应用程序没有运行。如果我将 EXE 路径复制到 Windows 资源管理器中,应用程序会运行,但它不会从方法中运行。任何帮助表示赞赏

【问题讨论】:

  • IIS 运行应用程序池的帐户是否有权访问和执行文件?
  • 我刚刚更新了应用程序池,以便它以我自己(管理员)而不是我们的服务帐户运行,结果相同。我会收到任何指示失败的消息吗?我根本没有收到任何反馈,该方法甚至被击中,但同样,它在 Page_Load 上按预期在本地执行
  • 当您说它“运行 exe”时 - 在哪里 它运行 exe?从名字(WPF)看,它听起来像是一个UI应用程序。 在网络服务器上运行(这是一项服务)将无法正常工作。您是否尝试在此处在客户端上调出一个 exe?
  • 它运行一个存储在共享驱动器上的 EXE。 \\\\cmbfs02\\Software\\web\\EmailSignature_WPF\\EmailSignature_WPF.exe 此 exe 已单独开发和编译,如果按照我指定的路径从服务器“双击”,则该 EXE 可以工作。最终目标是让用户导航到运行此 EXE 的已发布网站。现在,为了进行测试,我从 IIS 服务器导航到该站点,但这不是真正的最终用例。这能回答你的问题吗?
  • @gruff 但是:此应用程序是否设计为服务器端无头工具,仅代表 Web 服务器进行一些处理?还是用户期望与之交互的客户端 UI?因为你所做的只会对其中的第一个起作用。请记住:运行Process.Start 的不是客户端桌面 - 它是您的网络服务器,更具体地说是IIS / 应用程序池服务帐户。它没有可以显示 UI 的桌面。

标签: javascript c# asp.net pageload


【解决方案1】:

听起来您正试图在客户端上启动一个 UI exe,但实际上您正在做的是在网络服务器上执行它。如果那是正确的,那么从根本上说,您要做的就是……行不通。忽略实现必须完全不同的事实,浏览器被明确设计为从网络服务器运行任意可执行文件 - 当然它只能在某些操作系统上运行 - 在这种情况下可能是窗口。

几年前我可能会说“看看 ClickOnce” - 但我不知道是否仍然支持或推荐该选项。

【讨论】:

  • 我理解你所说的浏览器阻止这种情况的意思,但我正在重写我们在 C# 中拥有的旧 VB 应用程序。 Web 浏览器部分的原因是模仿 Web 应用程序并在运行 EXE 时避免“运行/取消”窗口。首先不使用Web App的原因是这是一个生成Outlook签名文件的应用程序,并且WordInterop COM库在服务器(Web App)上运行时将不起作用
  • @gruff 不会改变任何东西; a:浏览器不关心你的动机,并且 b:浏览器现在甚至没有看到这个 - 这里的一切都发生在 服务器上;浏览器看到的只是一小部分 html,它在加载后立即关闭 - 它看不到 Process.Start - 在服务器上
  • 那么有没有替代Process.Start 的方法?最初的应用程序使用了这段代码,并且成功了:&lt;head runat="server"&gt; &lt;script language="javascript" &gt; function todo() { //window.open('', '_self', ''); //window.close(); var theShell = new ActiveXObject("Shell.Application"); var theApp = "S:\\web\\EMS_2013\\EmailSignature1_2013.exe"; theShell.ShellExecute(theApp, "", "", "open", "1"); window.opener = '' window.close(); } &lt;/script&gt; &lt;/head&gt; &lt;body onload="window.opener='';todo()"&gt; &lt;/body&gt;
  • @gruff 不管替代方案是什么:它不会涉及Page_Load - 那是严格的服务器端。如果您可以通过ActiveXObject 编写脚本,那么祝您好运 - 但​​我不希望大多数浏览器喜欢这样。 IIRC 一个 &lt;a href&gt; 到一个 ClickOnce “.application” 文件在网络共享上曾经可以工作,但我多年来没有尝试过这样做
  • 是的 ClickOnce 仍然是一个东西...无论如何要从浏览器启动可执行文件,至少需要一个主动确认用户交互(点击)。如果 exe 未经发布者签名,则点击次数更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2017-10-03
  • 2022-12-31
相关资源
最近更新 更多