如何通过执行*.exe
文件来运行在本地运行的服务结构运行时之上构建的服务?
目前它只是抛出异常,然后应用程序终止。
我希望能够在隔离中启动服务,这样我就可以在创建服务包之前端到端地测试服务,然后再将其作为应用程序的一部分进行部署。我以前使用TopShelf和Web Jobs完成了这项工作,但这似乎与Service Fabric无关,即使它只是构建在控制台应用程序之上。
答案 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 集群。