vNext:使用 razor 视图而无需托管的控制台应用程序

2024-04-26

我正在创建执行一些文件转换的控制台应用程序。这些转换可以轻松完成,从输入文件创建模型,然后为输出执行 razor 模型。

为了在 IDE 中实现此功能,我使用了 Visual Studio 2015 预览版并创建了一个使用 MVC 的 vnext 控制台应用程序。 (然后您就可以获得开箱即用的剃须刀支持)。为了让这一切正常工作,您需要托管 MVC 应用程序,最便宜的方法是通过 WebListener 进行托管。所以我托管 MVC 应用程序,然后通过调用它"http://localhost:5003/etc/etc"获取构建输出的渲染视图。

但控制台应用程序不应该监听/使用端口。它只是一个用于文件转换的命令行工具。如果多个实例同时运行,它们将争夺在同一端口上托管页面。 (这可以通过动态选择端口来粗略地防止,但这不是我想要的)

所以我的问题是如何在不使用端口但使用尽可能多的 vnext 框架的情况下实现此功能。

简而言之:如何使用在控制台应用程序中传递模型的 cshtml 文件,该应用程序不使用 vnext razor 引擎的端口。

这是我目前使用的一些代码:

程序.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);
        }
    }
}

启动.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" });
            });
        }
    }
}

我使用以下代码解决了它:

程序.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();
        }
    }
}

启动.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" });
            });
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vNext:使用 razor 视图而无需托管的控制台应用程序 的相关文章

随机推荐

  • iOS/Objective-C 的 switch 语句中的失败

    假设我有一个包含五个案例的 switch 语句 但只有两个真正的方法被调用 如下所示 switch condition case conditionOutcome1 self firstMethod break case condition
  • 如何在隐身模式下启用 chrome 扩展的 pageAction 图标?

    即使选择 允许在隐身模式 后 使用 pageaction 在某些网址中呈现的扩展也不会在隐身模式下显示 background js 有以下内容 chrome runtime onInstalled addListener function
  • 使用WebView setHttpAuthUsernamePassword?

    我正在尝试进行基本身份验证以查看受保护的网址 我想访问受保护的网址 如下所示 http api test com userinfo vid 1234 所以我用 WebView 执行以下操作 mWebView setHttpAuthUsern
  • 如何在 Flutter 中保存用户登录详细信息?

    我是颤振新手 想要制作一个只有经过身份验证的用户 通过填写电子邮件和密码 才能使用的应用程序 所以我正在考虑制作一个名为的根小部件Authentication我将在其中检查用户是否经过身份验证 如果他们是那么带他们去Home Widget
  • ASP.NET MVC 4 cookie 消失

    我有一个 ASP NET 应用程序 它将身份验证 cookie 发送到 ASP NET MVC 应用程序 用作后台应用程序 我添加了一个全局过滤器 用于检查身份验证 cookie 的每个控制器操作 如果cookie存在 则允许用户进入该页面
  • 使用php在两个日期之间选择MS访问

    我想使用 php 从 ms access 选择数据 这是我的代码 dbdir D payroll2 ATT2000 MDB conn odbc connect DRIVER Microsoft Access Driver mdb DBQ d
  • 使用另一个视图控制器中的原型单元

    我想在多个故事板场景中使用相同的表视图单元格布局 我可以在其中一个场景中设计原型单元并以某种方式在另一个表视图控制器中访问它 即 dequeueReusableCellWithIdentifier 吗 这是不可能的 但您可以将原型单元格从源
  • 使用Boost获取成员函数的数量和参数类型? (升压::function_traits)

    对于普通的普通函数来说 它工作得很好 下面的代码工作得很好 它只打印应该的内容 int cdecl int char 2 int char include
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • 有没有一种 CSS 唯一的方法来完全隐藏部分溢出的元素?

    想象一下 您有一个元素的高度是浏览器窗口高度的百分比 该元素包含一堆块元素 有没有办法使用类似的东西overflow hidden但要确保最后一个块元素在溢出时完全隐藏而不是部分隐藏 使用 JavaScript 很容易做到这一点 但我更喜欢
  • 在ms access中存储大量图像

    我有一个库存 联系人数据库 需要在其中存储大量图像 10k 件物品 1k 人 现在 由于纯粹的膨胀 显然 ole 对象是不可能的 有没有更好的方法来做到这一点 例如存储图像的路径 将存储在数据库的文件夹中 并在我需要的地方显示该图像 这会很
  • 如何在没有 create-react-app 的情况下手动配置 React 的最小设置?

    我不想使用create react app 那么我该如何配置minimal一个简单的反应应用程序的工作开发环境 Note 我知道我可能会包含所有内容在运行时作为 JS https reactjs org docs add react to
  • Django为模型表单返回两个单独的__str__

    我有一个Task包含任务和实体外键的模型 class Task models Model task models CharField max length 500 entity models ForeignKey Entity 我有一个与一
  • 如何在meteor中建立单独的测试和开发数据库

    我已经为我的流星应用程序编写了一些测试 由于他们具有删除所有文档或填充新文档的设置和拆卸方法 因此我想在专用于测试的数据库上运行它们 我注意到数据库存储在 meteor local db 中 理想情况下 我希望从不同的端口访问 db tes
  • Android 2.X 和 3.X 上的 SQLiteOpenHelper 问题

    所以我犯了一个很大的错误 在 android 4 0 上测试我的代码 并认为它在其他版本上也能正常工作 但我在使用 SQLiteOpenHelper 时遇到 2 X 和 3 X 的问题 首先是代码 public class HelperDB
  • 未创建日志文件

    我需要一个可以在项目中的多个类中使用的全局记录器 我想在 ini 文件中设置记录器设置 我开始下面的例子here https stackoverflow com questions 20086754 how to use boost log
  • 获取 pandas 布尔系列为 True 的索引列表

    我有一个带有布尔条目的熊猫系列 我想获得一个索引列表 其中的值是True 例如输入pd Series True False True True False False False True 应该产生输出 0 2 3 7 我可以通过列表理解来
  • 查找大于或等于某个值的所有值

    假设我有下表 Team Score AA 81 BB 67 CC 44 DD 1 5 JJ 279 LL 49 TT 201 GG 158 MM 32 HH 89 我想要将所有得分超过 80 的球队放在另一个表中 我尝试了 Index Ma
  • Web 配置转换不适用于 Visual Studio Online、VS2013 和 Azure

    我有一个 MVC5 网站 使用 Visual Studio Online TFS 的持续集成成功地将暂存和生产版本部署到 Azure 我已经关注了这篇博文 使用自定义部署脚本通过 git 持续交付到 Azure 网站 http chrisk
  • vNext:使用 razor 视图而无需托管的控制台应用程序

    我正在创建执行一些文件转换的控制台应用程序 这些转换可以轻松完成 从输入文件创建模型 然后为输出执行 razor 模型 为了在 IDE 中实现此功能 我使用了 Visual Studio 2015 预览版并创建了一个使用 MVC 的 vne