Esegui un’utilità della riga di comando in ASP.NET

Ho bisogno di qualche consiglio per quanto riguarda l’uso di un programma di utilità da riga di comando da un’applicazione web C # / ASP.NET.

Ho trovato una utility di terze parti per la conversione di file in formato CSV. L’utilità funziona perfettamente e può essere utilizzata dalla riga di comando.

Ho cercato sul web esempi su come eseguire l’utilità della riga di comando e ho trovato questo esempio.

Il problema è che non è molto buono. Quando provo a utilizzare il codice di esempio con la mia utilità, viene richiesto di installare l’utilità sul computer client. Questo non è quello che voglio. Non voglio che l’utente veda cosa sta succedendo in background.

È ansible eseguire il lato server di comando ed elaborare il file da lì?

Qualsiasi aiuto sarebbe molto apprezzato.

Ho fatto più volte cose del genere in passato, ed ecco cosa ha funzionato per me:

Creare un’implementazione IHttpHandler (più semplice da fare come file .ashx) per gestire una conversione. All’interno del gestore, utilizzare System.Diagnostics.Process e ProcessStartInfo per eseguire l’utilità della riga di comando. Dovresti essere in grado di redirect lo standard output al stream di output della tua risposta HTTP. Ecco un codice:

public class ConvertHandler : IHttpHandler { #region IHttpHandler Members bool IHttpHandler.IsReusable { get { return false; } } void IHttpHandler.ProcessRequest(HttpContext context) { var jobID = Guid.NewGuid(); // retrieve the posted csv file var csvFile = context.Request.Files["csv"]; // save the file to disk so the CMD line util can access it var filePath = Path.Combine("csv", String.Format("{0:n}.csv", jobID)); csvFile.SaveAs(filePath); var psi = new ProcessStartInfo("mycsvutil.exe", String.Format("-file {0}", filePath)) { WorkingDirectory = Environment.CurrentDirectory, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; using (var process = new Process { StartInfo = psi }) { // delegate for writing the process output to the response output Action dataReceived = ((sender, e) => { if (e.Data != null) // sometimes a random event is received with null data, not sure why - I prefer to leave it out { context.Response.Write(e.Data); context.Response.Write(Environment.NewLine); context.Response.Flush(); } }); process.OutputDataReceived += new DataReceivedEventHandler(dataReceived); process.ErrorDataReceived += new DataReceivedEventHandler(dataReceived); // use text/plain so line breaks and any other whitespace formatting is preserved context.Response.ContentType = "text/plain"; // start the process and start reading the standard and error outputs process.Start(); process.BeginErrorReadLine(); process.BeginOutputReadLine(); // wait for the process to exit process.WaitForExit(); // an exit code other than 0 generally means an error if (process.ExitCode != 0) { context.Response.StatusCode = 500; } } } #endregion } 

Il comando sta eseguendo il lato server. Qualsiasi codice è in esecuzione sul server. Il codice nell’esempio che tu fornisci funziona. Devi solo assicurarti che l’utility sia configurata correttamente sul server e che tu disponga delle autorizzazioni per la directory / il file.