如何在本地运行Service Fabric exe

时间:2017-01-05 21:38:50

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

如何通过执行*.exe文件来运行在本地运行的服务结构运行时之上构建的服务?

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

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

4 个答案:

答案 0 :(得分:2)

您需要一个本地服务架构群集来调试Service Fabric个应用,但首先您需要安装The Azure Service Fabric SDK,请检查此article以帮助您这一点。

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

答案 1 :(得分:0)

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

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

Here's如何使用它。

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

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

答案 2 :(得分:0)

当我想以独立的红k在本地运行时,我将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应用程序作为启动程序运行。

答案 3 :(得分:0)

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

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