Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Applikationen aus ASP.NET ausführen

Geschrieben von: Christoph Wille
Kategorie: ASP.NET

Irgendwo gibt es immer eine kleine Kommandozeilenapplikation, die etwas kann, was keine Komponente kann. Und dann taucht die Frage auf, wie man dieses Programm aus ASP.NET heraus starten, und den Output dann weiterverwenden kann.

Unter ASP gibt's die AspExec Gratiskomponente von ServerObjects, die im Artikel Mailadressen-überprüfen für Fortgeschrittene beschrieben ist. Obwohl man diese Komponente theoretisch unter ASP.NET einsetzen könnte, rate ich wie immer von nicht-managed Lösungen ab - sie sind zu langsam.

Daher muß ich wohl oder übel eine managed Lösung präsentieren, oder?

Da ich ja in die Entwicklung von SharpDevelop eingebunden bin, habe ich beim Code Review einiges über die verschiedenen "versteckten" Klassen gelernt - weil wer bitte kommt auf die Idee, eine Klasse zur Ausführung von Programmen im Namespace für Compiler zu verstecken? Dort findet sie nun wirklich kein normaler Mensch!

Die Klasse, die uns interessiert, ist Executor, die sich im System.CodeDom.Compiler Namespace versteckt. Diese bietet die Methode ExecWaitWithCapture (der Name sagt ja fast alles), welche wir sogleich in eine wiederverwendbare Funktion für uns verpacken:

// execute an application, return output string
string ExecuteCmdLineApp(string strCmd)
{
  string output = "";
  string error  = "";

  TempFileCollection tf = new TempFileCollection();
  Executor.ExecWaitWithCapture(strCmd, tf, ref output, ref error);

  StreamReader sr = File.OpenText(output);
  StringBuilder strBuilder = new StringBuilder();
  string strLine = null;

  while (null != (strLine = sr.ReadLine()))
  {
    if ("" != strLine)
    {
      strBuilder.Append(strLine);
      strBuilder.Append("\r\n");
    }
  }
  sr.Close();

  File.Delete(output);
  File.Delete(error);

  return strBuilder.ToString();
}

Der meiste Code kommt von der speziellen Art der Verwendung der ExecWaitWithCapture Methode. Diese schreibt den Output als auch die Fehler in temporäre Dateien, die man auslesen kann. Die Dateien kommen als TempFileCollection Parameter in die Methode, die Namen der Dateien als zwei String Parameter retour. Der erste Parameter ist wenigstens von Anfang an klar - die Befehlszeile der Applikation, deren Output gecaptured werden soll.

Da der Output in einer Datei landet, muß ich diese auch wieder auslesen. Dazu verwende ich einen StreamReader als auch einen StringBuilder. Gründe für diese Vorgehensweise finden sich im Artikel Dateien lesen in ASP.NET.

Eine wichtige Information muß ich noch weitergeben: wie man aus dem Sourcecode ersehen kann, lösche ich Leerzeilen aus dem Output. Wer dies nicht möchte, sollte auf folgende Eigenheit der Executor Klasse aufpassen: ein Carriage Return/Line Feed Paar im Output des Programms wird in ein solches plus eine Leerzeile umgesetzt!

Ein wichtiger Part fehlt uns noch, um die Funktion zumindest theoretisch zum funktionieren zu bringen - die Namespace Import Statements:

<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Text" %>
<% @Import Namespace="System.CodeDom.Compiler" %>

Nun bauen wir uns noch ein highly sophisticated User Interface:

<form runat="server" method="post">
Kommando: <asp:TextBox id="txtCommand" runat="server" 
    value="ping localhost" size=30 />
<asp:Button id="btnSubmit" text="Kommando ausführen" 
    onClick="btnSubmit_Click" 
    runat="server" />

<pre>
<asp:Label id="txtResult" runat="server" />
</pre>

</form>

und verdrahten die Schaltfläche zur entsprechenden Event Methode:

void btnSubmit_Click(Object Sender, EventArgs E)
{
  string strResult = "Error";
  try
  {
    strResult = ExecuteCmdLineApp(txtCommand.Text);
  }
  catch(Exception e)
  {
    strResult = e.ToString();
  }
  txtResult.Text = strResult;
}

Das wär's. Sogar Exceptions werden jetzt behandelt (Programm existiert nicht, oder ein Fehler irgendeiner anderen Art).

Natürlich erproben wir unser highly sophisticated User Interface mit einer ebensolchen Applikation: ping.exe. Hier der entsprechende Screenshot:

Der Grund, warum ich die Leerzeilen alle gelöscht habe? Den Output der Applikation wird der Benutzer sowieso nur in den seltensten Fällen zu Gesicht bekommen - weil die ASP.NET Seite den Output aufparst und die wichtigen Infos herausfiltert - für die Weiterverwendung.

Schlußbemerkung

Oft findet man wichtige Funktionalitäten gerade dort, wo man sie nicht vermuten würde, und wo schon gar nicht gesucht hätte. Daher mein Rat: einen Tag Zeit nehmen, und nur die .NET Reference durchklicken, damit man einen Überblick bekommt, welcher Namespace welche Funktionalitäten zur Verfügung stellt.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Dateien lesen in ASP.NET
Kommandozeilen-Programme aufrufen
Mailadressen-überprüfen für Fortgeschrittene
Schluß mit lustig Teil 3 - das Hfnetchk Tool

Links zu anderen Sites

ServerObjects
SharpDevelop

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.