ASP.NET ausführen einer EXE-Datei
Im Versuch zum ausführen einer alten .NET-Anwendung von einem ASP.NET website. Nach dem Lesen der web-und Stackoverflow (für ein ähnliches problem) komme ich zum folgenden code.
Das Problem ist, dass ich immer einen Fehlercode an (ich bin mit dem administrator Konto
nur zu Testzwecken). Wenn ich die exe starte es manuell funktioniert ok.
private void Execute(string sPath)
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.UserName = "administrador";
string pass = ".............";
System.Security.SecureString secret = new System.Security.SecureString();
foreach (char c in pass) secret.AppendChar(c);
proc.StartInfo.Password = secret;
proc.StartInfo.WorkingDirectory = ConfigurationManager.AppSettings["WORKINGDIRECTORY"].ToString();
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = sPath;
proc.Start();
proc.WaitForExit();
string result = proc.StandardOutput.ReadToEnd();
Response.Write(result + " - " + proc.ExitCode);
proc.Close();
}
}
Den exit-Code den ich bekomme, ist: -1066598274
Ergebnis-variable ist leer.
Es wird keine exception geworfen
Ich bin mit Windows 2008 mit IIS 7.0
Vielen Dank im Voraus,
Ezequiel
- vergessen, hinzuzufügen, ich bin mit W2K8 mit IIS7
- Bitte sagen, was "error code", die Sie erhalten. Besser noch, poste den kompletten Ausnahme, einschließlich aller InnerException, durch die Veröffentlichung der Ergebnisse von ex.ToString() auf, nachdem Sie Sie zu fangen ex.
- Auch, Bearbeiten Sie Ihre Frage, nicht, Kommentare zu hinterlassen.
- Meinst du exit-Code = -1066598274 ?
- Ich weiß, das ist extrem alt, aber du hast "administrator" Rechtschreibfehler in deinem code, nicht sicher, ob Sie es machen würde(gemacht haben) einen Unterschied.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie die
proc.StartInfo.LoadUserProfile
Eigenschafttrue
so das Benutzerprofil des Administrators Sachen in der Registrierung geladen werden (AFAIK geschieht dies nicht standardmäßig).Auch, es könnte lehrreich sein, führen Sie eine 'hello world' - Programm, um zu sehen, ob das problem mit actaully erstellen der Prozess oder wenn der Prozess selbst ist Probleme mit dem ausführen in dem Zusammenhang ist gegeben.
Schließlich, als ein Schritt bei dem Versuch, einzugrenzen, wo das problem sein könnte, möchten Sie vielleicht zu laufen ASP.NET Prozess selbst mit admin-oder system-Anmeldeinformationen zu sehen, wenn etwas in den Berechtigungen des Kontos, zu dem ASP.NET Instanz ausgeführt wird, wird ein Teil des Problems (aber bitte tun Sie dies nur für Fehlerbehebung).
Tun das nicht. Dies ist einfach nur schmutzig und sollte nicht getan werden, von ASP.NET
Tun das nicht. Das ist sehr schlecht und nicht skalierbar ist und schlecht für den web-server
Nicht
Nicht
Nicht
Wenn Sie
dann liest man den Bach, wie der Prozess ausgeführt wird, statt vor dem Aufruf
Gleiche gilt für die standard-Fehler-stream. Finden Sie die MSDN - Dokumentation für weitere Details.
Müssen Sie die Reihenfolge der Ausgabe zu Lesen am Ende.
Erwartet es, Sie zu Lesen, bevor Sie die waitforexit() nennen, so sollten Sie haben:
Wenn die Anwendung, die Sie versuchen zu laufen, ist wirklich ein .NET-Anwendung, wie Sie sagen, können Sie nicht brauchen, um ausführen in einem separaten Prozess. Stattdessen können Sie die Tatsache nutzen, dass .NET-Programme sind auch Baugruppen. Ich glaube nicht, dass Visual Studio lässt Sie auf Assemblys, die am Ende in die .exe-Datei, aber die command-line compiler.
Ich würde versuchen, mithilfe der Befehlszeilen-compiler zum erstellen einer wrapper-assembly verweist einfach die ausführbare assembly, und direkt ruft seine Main () - Methode auf und übergibt Sie in einem string-array, der alle Kommandozeilen-Parameter, die Sie würde normalerweise angeben. Der exit-code, falls vorhanden, wird ein integer-return-value von der Main-Methode. Dann rufen Sie einfach an Ihren wrapper-assembly aus dem ASP.NET app.
Je nachdem, was die ausführbare Datei macht und wie viel es interagiert mit der Konsole, kann dieser Ansatz nicht funktionieren. Aber wenn es funktioniert für deinen Fall sollte es deutlich besser als drehen bis einem separaten Prozess.
Was ich zu tun ist, um die ausführbare Datei mit der Bezeichnung von einem ms-sql-job.
Die ausführbare Datei ausgeführt werden würden, wie SQL server-agent-Dienstkonto.
Den neuen job aufgerufen werden kann, die Verwendung von EXEC msdb.dbo.sp_start_job @jobname, wo @jobname ist
die variable trägt den Namen der Arbeit, die Sie wollen, um zu starten.
Beachten Sie, dass, wenn dieser job startet, wird die Benutzeroberfläche der exe wird ausgeblendet und wird nicht angezeigt, sondern Sie finden ihn in Ihrer task-manager.
Ich haben beschäftigt diese Methode in mehreren Anwendungen vor allem zeitaufwändige Operationen, die durchgeführt werden kann auf der web-Seite.
Folgenden code verwenden: