2016-09-30 69 views
7

我有時在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); 
} 
+0

如果您與我們爲什麼ü需要知道的分享,我可以幫我們想出一個更好的解決方案。 –

+0

我們在VS中使用F5在本地運行解決方案以進行調試,而不是部署到需要很長時間的集羣。 – user1496062

+0

我不知道新的2.2 SDK是否能解決您的問題。它引入了一個很棒的功能:使用單節點集羣進行本地調試。您可以查看發行說明以獲取更多信息https://blogs.msdn.microsoft.com/azureservicefabric/2016/09/13/release-of-service-fabric-sdk-2-2-207-and-runtime-5 -2-207/ –

回答

4

這就是我想出的東西,但沒有一個例外會更好(注意:在一些項目中使用的核心)

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

如。

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 
} 
+0

你能解釋一下這個意圖是如何工作的嗎? – cassandrad

+0

如果(IsSFHosted == false){starviatweblistener(..)} //顯然不適用於有狀態服務 – user1496062

+0

GetNodeContext不會在本地調試羣集和本地羣集上引發異常。不過,我不明白這是如何工作的。我不得不改變代碼來使它工作。 var node = FabricRuntime.GetNodeContext(); return node.IPAddressOrFQDN!=「localhost」; – cassandrad

相關問題