我如何在本地 运行 Service Fabric exe

How do I run a Service Fabric exe locally

我如何通过执行 *.exe 文件 运行 在本地 运行 本地 运行 建立一个建立在服务架构之上的服务?

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

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

您需要一个本地 service fabric 集群 来调试 Service Fabric 应用程序,但首先您需要安装 The Azure Service Fabric SDK,检查这个 article 来帮助你做到这一点。

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

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

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

Here's如何使用。

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

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

当我想 运行 作为独立的 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();
    }
}

如果您像我一样正在使用某些实践,例如配置服务结构应用程序以读取应用程序设置等,这可能就足够了。 Startup.cs 相同,因此 IoCC 注册和托管服务相同。

我必须确保我的服务结构服务尽可能标准的唯一一点特别之处如下:

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

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 应用程序包含服务作为启动。

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

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