【问题标题】:How do I run a Service Fabric exe locally如何在本地运行 Service Fabric exe
【发布时间】:2017-05-20 14:14:48
【问题描述】:

如何通过执行 *.exe 文件来运行基于 Service Fabric 运行时构建的服务?

目前它只是抛出一个异常然后应用程序被终止。

我希望能够在隔离中启动服务,这样我就可以在创建服务包之前端到端测试服务,然后再将其部署为应用程序的一部分。我之前使用 TopShelf 和 Web Jobs 完成了此操作,但这似乎不适用于 Service Fabric,即使它只是构建在控制台应用程序之上。

【问题讨论】:

  • 很可能你不能运行它,就像你不能只运行一个asp.net网站一样。它必须被托管,我不知道有本地化的 Fabric Service 主机。
  • 好吧,像 .netcore asp.net 这样的所有新东西都可以在本地自行运行,您不需要任何支持。
  • 实际上不能,您仍然必须将其托管在某个...例如EXE之类的东西中。您不能只构建一个本地运行 MVC 的 exe you have to configure the exe to host Mvc, and configure MVC with a root directory 等,它仍在托管.. 它只是不在 IIS 中。

标签: c# console-application azure-service-fabric


【解决方案1】:

您需要一个本地服务结构集群来调试Service Fabric 应用程序,但首先您需要安装The Azure Service Fabric SDK,检查此article 以帮助您完成此操作。

然后将您的应用程序部署到您的本地集群中,这个 Microsoft 的 article 可能会很有用。

【讨论】:

  • 如果不将其部署到集群中运行,就没有办法做到这一点吗?我通常只是在我的测试设置中启动 exe,然后端到端测试应用程序,然后再次将其拆除。每次部署整个应用程序似乎有点矫枉过正?
  • 这是我们在本地运行 Service Fabric 应用程序的唯一方法,我认为必须拥有本地 SF 集群。
  • @KevinSmith 这似乎是唯一的方法,因为所有微软的文档都提到使用它;例如看到这个article
  • 有点烦人,因为在文档中它说它是一个简单的控制台应用程序......但实际上它与必须部署非常相关。理论上,可以在测试运行测试之前部署应用程序并将其删除。
  • 找不到解决办法,所以最终在测试设置中将应用程序部署到本地集群,然后将其拆除,实际上工作得很好,速度也很快,您只需使用fabric:/{Guid.NewGuid()}的名称
【解决方案2】:

您可以将常规控制台应用添加到您的解决方案中,参考服务项目。然后,您可以使用服务上下文和状态管理器的模拟来创建服务实例。

Here's 一个有助于模拟的包。

Here's如何使用。

它的用途不仅限于单元测试场景。确保为服务远程处理进行依赖注入(使用IServiceProxyFactory / IActorProxyFactory)而不是使用ServiceProxy.Create

如果你使用FabricClient,你也必须为此进行依赖注入。

【讨论】:

  • 真的不想模拟任何代码,想像在现场一样运行每个服务的端到端测试。
【解决方案3】:

当我想作为独立的 kestrel 在本地运行时,我将 Program.cs 替换为以下通用主机(对于 dotnet core 3.1+)

public static class Program
{
    public static void Main(string[] args)
    {
        Host
            .CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
            .Build()
            .Run();
    }
}

如果您正在使用某些做法,例如配置服务结构应用程序以读取 appsettings 等,这可能就足够了,就像我正在做的那样。 Startup.cs 是一样的,所以 IoCC 注册和托管服务是一样的。

我必须确保我的 Service Fabric 服务尽可能标准的唯一一点特别之处是:

在主服务中(例如:无状态服务)

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                return new WebHostBuilder()
                            .UseKestrel()
                            .UseCommonConfiguration() //this is custom
                            .ConfigureServices(
                                services => services
                                    .AddSingleton<StatelessServiceContext>(serviceContext))
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseStartup<Startup>()
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                            .UseUrls(url)
                            .Build();
            }))
    };
}

注意UseCommonConfiguration() 扩展是:

public static class WebHostBuilderExtensions
{
    public static IWebHostBuilder UseCommonConfiguration(this IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

            if (env.IsDevelopment())
            {
                var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                config.AddUserSecrets(appAssembly, optional: true);
            }
        });

        return builder;
    }
}

我想找到一种干净的方法来交换 Program.cs,具体取决于我是作为启动运行 Web 应用程序,还是作为启动运行包含服务的 Service Fabric 应用程序。

【讨论】:

    【解决方案4】:

    为避免设置服务结构的麻烦并直接在本地计算机上调试 Web 应用程序,您可以在我的博客中关注这篇文章 -> Quest Solution

    您将能够调试您的 ASP.net 应用程序,而无需在本地安装 Service Fabric 集群。

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 1970-01-01
      • 2016-10-12
      • 2019-03-20
      • 2018-06-07
      • 2017-03-25
      • 2019-08-31
      • 2019-07-24
      • 2018-04-13
      相关资源
      最近更新 更多