Azure 应用服务上的 Service Fabric 客户端。无法加载 DLL 'FabricCommon.dll'

Service Fabric Client on Azure App Service. Unable to load DLL 'FabricCommon.dll'

我在 Azure 上有 Service Fabric 并且 我有 Azure App Service(ASP.NET MVC 网站),它是 Service Fabric 微服务的客户端。

当我 运行 Web 应用程序时,它说:无法加载 DLL 'FabricCommon.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

我见过 但我不确定是否可以在 Azure App Service 上安装 Service Fabric SDK

这是我的客户:

var factory = new CustomWcfCommunicationClientFactory<TContract>(
                CreateDefaultNetTcpBinding(),
                endpointBehaviors: new List<IEndpointBehavior> {new StarShipEnpointBehavior(up)},
                endpointIdentity: EndpointIdentity.CreateDnsIdentity("MyIdentity"),
                exceptionHandlers: new List<IExceptionHandler> {new WcfClientExceptionHandler()},
                servicePartitionResolver: ServicePartitionResolver.GetDefault());
var serviceFabricDescription = dict[typeof(TContract)];
return new WcfCommunicationClient<TContract>(
                factory,
                serviceFabricDescription.Uri,
                ServicePartitionKey.Singleton,
                listenerName: serviceFabricDescription.ListenerName);

其中 'CustomWcfCommunicationClientFactory' 与标准库 'Microsoft.ServiceFabric.Services.Wcf' 中的 'WcfCommunicationClientFactory' 几乎相同,但允许我提供行为和身份

这是堆栈跟踪:

[DllNotFoundException: Unable to load DLL 'FabricCommon.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
   System.Fabric.Interop.NativeCommon.FabricGetConfigStore(Guid& riid, IFabricConfigStoreUpdateHandler updateHandler) +0
   System.Fabric.Common.NativeConfigStore.CreateHelper(IFabricConfigStoreUpdateHandler updateHandler) +93
   System.Fabric.Interop.Utility.WrapNativeSyncInvoke(Func`1 func, String functionTag, String functionArgs) +29
   System.Fabric.Interop.Utility.RunInMTA(Func`1 func) +55
   System.Fabric.Common.Tracing.TraceConfig.InitializeFromConfigStore(Boolean forceUpdate) +133
   Microsoft.ServiceFabric.Services.ServiceTrace..cctor() +23

[TypeInitializationException: The type initializer for 'Microsoft.ServiceFabric.Services.ServiceTrace' threw an exception.]
   Microsoft.ServiceFabric.Services.Communication.Client.CommunicationClientCache`1..ctor(String traceId) +63
   Microsoft.ServiceFabric.Services.Communication.Client.CommunicationClientFactoryBase`1..ctor(IServicePartitionResolver servicePartitionResolver, IEnumerable`1 exceptionHandlers, String traceId) +283
   StarShip.Web.Logic.HelperService.CustomWcfCommunicationClientFactory`1..ctor(Binding clientBinding, IEnumerable`1 exceptionHandlers, IServicePartitionResolver servicePartitionResolver, String traceId, Object callback, ICollection`1 endpointBehaviors, EndpointIdentity endpointIdentity) +90
   StarShip.Web.Logic.HelperService.WcfHelper.GetClient(ICurrentUserProvider up) +504
   StarShip.Web.Logic.Services.<GetLocations>d__4.MoveNext() +98
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   StarShip.Web.Logic.Services.<CreateLoginModel>d__3.MoveNext() +260
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   StarShip.Web.Controllers.<Index>d__3.MoveNext() +215
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +93
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +72
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +30
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +186
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +38
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +38
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +44
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +399
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +157

为了从集群外部与 SF 服务通信,您需要在服务内部公开一个通信端点,例如 WebApi or WCF, or a Service Bus listener

更多信息here

编辑:

您的代码片段使用了不可用的 Service Fabric SDK。因此,改为依靠纯 WCF 代码来创建客户端代理。例如,从现有客户端复制它。或者公开元数据端点,如 this 并添加服务引用。

好的 我的故事中棘手的部分是我不想向外界公开我的任何 Service Fabric 端点​​。相反,我想 link Azure Web App 直接使用 VPN 连接到 Service Fabric 集群。问题是我不能在没有安装 SDK 的情况下使用 service fabric 类。所以我现在使用 HTTP API。 https://github.com/lAnubisl/ServiceFabricHttpApiClient