如何判断是否在Service Fabric下运行

16

我有时在Visual Studio本地运行项目,有没有更好的方法来检测我是否由SF托管,而不是使用异常。我可以看到可能是路径或入口程序集,但一定有更好的方法。

try
{
    ServiceRuntime.RegisterServiceAsync("FisConfigUIType",
        context = > new WebHost < Startup > (context, loggerFactory, "ServiceEndpoint", Startup.serviceName)).GetAwaiter().GetResult();
    Thread.Sleep(Timeout.Infinite);
}
catch (FabricException sfEx)
{
    RunLocal(args, loggerFactory);
}

如果您告诉我们您需要知道的原因,我可能会帮助我们提出更好的解决方案。 - Rotem Varon
我们在本地使用F5进行调试,而不是部署到集群中,因为部署需要太长时间。 - user1496062
我想知道新的2.2 SDK是否可以解决你的问题。它引入了一个很棒的功能:使用1节点集群进行本地调试。你可以查看发布说明获取更多信息:https://blogs.msdn.microsoft.com/azureservicefabric/2016/09/13/release-of-service-fabric-sdk-2-2-207-and-runtime-5-2-207/ - Rotem Varon
它有所帮助,但即使是打包一个小的核心应用程序也超过了100兆,因此我仍然希望有一些类似于ISSFHosted但没有处理异常的东西。 - user1496062
很好的问题,在 GitHub 上开了一个问题,希望他们能够改进这个问题。 - spottedmahn
2个回答

22

2
这个应该被点赞,而且它的好处是在入口库中没有依赖性。 - user1496062
2
正确答案! - Miguel Domingues

5

这是我想到的,但最好没有异常(请注意,有些项目使用Core)

static bool IsSFHosted()
{
    try
    {
        FabricRuntime.GetNodeContext();
        return true;
    }
    catch (FabricException sfEx) when (sfEx.HResult == -2147017661 || sfEx.HResult == -2147017536 || sfEx.InnerException?.HResult == -2147017536)
    {
        return false;
    }
}

eg.

var isSFHosted = IsSFHosted();
var servicesPreRegister = builder.GetPreRegisterServicesForStore(node: node, security: false);

if (isSFHosted)
{
    ServiceRuntime.RegisterServiceAsync("DeliveriesWriteType",
        context => new WebAPI(context, loggerFactory, servicesPreRegister)).GetAwaiter().GetResult();
}
else
{
    loggerFactory.AddConsole();
    // run with local web listener with out SF
}

请问您能否详细解释一下这个计划如何运作? - cassandrad
如果(IsSFHosted == false){ starviatweblistener(..)} // 显然不适用于有状态服务 - user1496062
GetNodeContext在本地调试集群和本地部署集群上不会抛出异常。但是,我仍然不理解它的工作原理。我不得不更改代码才能使其正常工作。 var node = FabricRuntime.GetNodeContext(); return node.IPAddressOrFQDN != "localhost"; - cassandrad
将上述内容添加到控制台应用程序中进行尝试。我得到了一个BadImageFormatException,即使我使用try-catch块也无法捕获它:System.BadImageFormatException:'无法加载文件或程序集“System.Fabric,Version = 5.0.0.0,Culture = neutral, PublicKeyToken = 31bf3856ad364e35”之一或其依赖项。尝试加载格式不正确的程序。' - Nizar Qamar
你仍需要为SF代码编译64位版本。 - user1496062
1
@cassandrad 我们的主要用途是在未托管在SF时重复使用服务代码,但最好的用途是可以本地调试并部署到本地集群。 - user1496062

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接