vNext: Konsolen-App, die Rasiermessersichten ohne Hosting verwendet

Ich erstelle eine Konsolenanwendung, die einige Dateikonvertierungen durchführt. Mit diesen Konvertierungen können Sie ganz einfach ein Modell aus der Eingabedatei erstellen und anschließend Rasiermessermodelle für die Ausgabe ausführen.

Damit dies in der IDE funktioniert, habe ich die Vorschau von Visual Studio 2015 verwendet und eine vnext-Konsolenanwendung erstellt, die MVC verwendet. (Sie erhalten dann Rasierer-Unterstützung aus der Box). Um dies alles zum Laufen zu bringen, müssen Sie die MVC-App hosten. Der billigste Weg, dies zu tun, ist das Hosten über einen WebListener. Also hoste ich die MVC App und rufe sie dann über @ a"http://localhost:5003/etc/etc", um die gerenderten Ansichten abzurufen, die die Ausgabe erstellen.

Aber die Konsolen-App soll keinen Port abhören / benutzen. Es ist nur ein Befehlszeilenprogramm für Dateikonvertierungen. Wenn mehrere Instanzen gleichzeitig ausgeführt würden, würden sie darum kämpfen, die Seiten auf demselben Port zu hosten. (Dies könnte grob verhindert werden, indem man einen Port dynamisch auswählt, aber das ist nicht das, wonach ich suche)

So meine Frage ist, wie würden Sie dies zum Laufen bringen, ohne einen Port zu verwenden, aber so viel wie möglich von den vnext-Frameworks zu verwenden.

Kurz gesagt: Wie kann ich cshtml-Dateien, die ich an Modellen übergebe, in einer Konsolen-App verwenden, die keinen Port mit der vnext-Razor-Engine verwendet?

Hier ist ein Code, den ich derzeit verwende:

Program.cs

using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.DependencyInjection.Fallback;
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace ConsoleTest
{
    public class Program
    {
        private readonly IServiceProvider _hostServiceProvider;

        public Program(IServiceProvider hostServiceProvider)
        {
            _hostServiceProvider = hostServiceProvider;
        }

        public async Task<string> GetWebpageAsync()
        {
            using (var httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri("http://localhost:5003/home/svg?idx=1");
                httpClient.DefaultRequestHeaders.Accept.Clear();
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
                return await httpClient.GetStringAsync("");
            }
        }

        public Task<int> Main(string[] args)
        {
            var config = new Configuration();
            config.AddCommandLine(args);

            var serviceCollection = new ServiceCollection();
            serviceCollection.Add(HostingServices.GetDefaultServices(config));
            serviceCollection.AddInstance<IHostingEnvironment>(new HostingEnvironment() { WebRoot = "wwwroot" });
            var services = serviceCollection.BuildServiceProvider(_hostServiceProvider);

            var context = new HostingContext()
            {
                Services = services,
                Configuration = config,
                ServerName = "Microsoft.AspNet.Server.WebListener",
                ApplicationName = "ConsoleTest"
            };

            var engine = services.GetService<IHostingEngine>();
            if (engine == null)
            {
                throw new Exception("TODO: IHostingEngine service not available exception");
            }

            using (engine.Start(context))
            {
                var tst = GetWebpageAsync();
                tst.Wait();
                File.WriteAllText(@"C:\\result.svg", tst.Result.TrimStart());

                Console.WriteLine("Started the server..");
                Console.WriteLine("Press any key to stop the server");
                Console.ReadLine();
            }
            return Task.FromResult(0);
        }
    }
}

Startup.cs

using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.ConfigurationModel;

namespace ConsoleTest
{
    public class Startup
    {
        public IConfiguration Configuration { get; private set; }

        public void ConfigureServices(IServiceCollection services)
        {
            // Add MVC services to the services container
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app)
        {
            //Configure WebFx
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    null,
                    "{controller}/{action}",
                    new { controller = "Home", action = "Index" });
            });
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage