vNext: Console app som bruker utsikt kniv uten hosting

stemmer
4

Jeg skaper konsoll program som gjør noen filkonverteringer. Disse omdannelser enkelt gjort skape en modell fra inngangen fil og deretter gjennomføring av barberhøvel-modeller for utgangen.

Å ha denne arbeids i IDE Jeg brukte Visual Studio 2015 forhåndsvisning og skapte en vnext konsoll applikasjon som bruker MVC. (Du får kniv støtte ut av boksen da). For å få dette alle jobber du trenger å være vert MVC app skjønt, og den billigste måten å gjøre det på er vert er gjennom en WebListener. Så jeg vert MVC app og deretter ringe det gjennom http://localhost:5003/etc/etcå få de gjengitte synspunkter som konstruerer utgangen.

Men konsollen app ikke er ment å lytte til / bruke en port. Det er bare et kommandolinjeverktøy for filkonverteringer. Hvis flere forekomster ville kjøre samtidig ville de kjempe for å være vert for sidene på samme port. (Dette kan grovt forebygges ved å velge en port dynamisk, men dette er ikke det jeg leter etter)

Så spørsmålet mitt er hvordan vil du få dette arbeidet uten å bruke en port, men å bruke så mye av vnext rammer som mulig.

Kort sagt: Hvordan kan jeg bruke cshtml filer som jeg passerer modeller i en konsoll app som ikke bruker en port ved hjelp av vnext barberhøvel motoren.

Her er noen kode jeg bruker for tiden:

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 });
            });
        }
    }
}
Publisert på 19/11/2014 klokken 09:39
kilden bruker
På andre språk...                            


1 svar

stemmer
3

Jeg løste det ved hjelp av følgende kode:

Program.cs

using System;
using System.Threading.Tasks;
using Microsoft.AspNet.TestHost;
using Microsoft.AspNet.Builder;
using Microsoft.Framework.Runtime.Infrastructure;

namespace ConsoleTest
{
    public class Program
    {
        private Action<IApplicationBuilder> _app;
        private IServiceProvider _services;

        public async Task<string> TestMe()
        {
            var server = TestServer.Create(_services, _app);
            var client = server.CreateClient();
            return await client.GetStringAsync("http://localhost/home/svg?idx=1");
        }

        public void Main(string[] args)
        {
            _services = CallContextServiceLocator.Locator.ServiceProvider;
            _app = new Startup().Configure;

            var x = TestMe();
            x.Wait();
            Console.WriteLine(x.Result);

            Console.ReadLine();
        }
    }
}

Startup.cs

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

namespace ConsoleTest
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseServices(services =>
            {
                // Add MVC services to the services container
                services.AddMvc();
            });
            //Configure WebFx
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    null,
                    "{controller}/{action}",
                    new { controller = "Home", action = "Index" });
            });
        }
    }
}
Svarte 19/11/2014 kl. 22:10
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more