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

1.5k views Asked by At

I have Service Fabric on Azure and I have Azure App Service (ASP.NET MVC website) which is the client for Service Fabric microservice.

When I run the web app it says: Unable to load DLL 'FabricCommon.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

I've seen Azure Service Fabric missing DLL on production server: FabricCommon.dll but I'm not sure it is possible to install service fabric SDK on azure App Service

Here is my client:

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);

where 'CustomWcfCommunicationClientFactory' is almost same as 'WcfCommunicationClientFactory' from standard library 'Microsoft.ServiceFabric.Services.Wcf' but allows me to provide behaviours and identity

Here is the stack trace:

[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
2

There are 2 answers

0
Anubis On BEST ANSWER

Ok The tricky part of my story was that I don't want to expose any of my Service Fabric endpoints for outside world. Instead I wanted to link Azure Web App to the Service Fabric cluster directly using VPN. The problem is that I cannot use service fabric classes without SDK installed. So I use HTTP API now. https://github.com/lAnubisl/ServiceFabricHttpApiClient

1
LoekD On

In order to communicate with a SF service from outside the cluster, you need to expose a communication endpoint inside the service, like a WebApi or WCF, or a Service Bus listener.

More info here

Edit:

Your code snippet uses the Service Fabric Sdk, which is not available. So instead, rely on pure WCF code to create the client proxy. Copy it from an existing client for instance. Or expose an metadata endpoint like this and add a service reference.