具有WCF通信部署的Service Fabric服务

时间:2017-10-02 11:42:49

标签: c# wcf deployment cloud azure-service-fabric

这是一个简单的Service Fabric无状态服务,带有WCF通信和它的客户端 - 一个控制台应用程序。它在本地群集上运行良好,客户端可以从服务中获得响应。但是如果我将其部署在云中,我不知道如何与服务进行通信。如何从控制台应用程序访问它?

使用WCF通信的SF无状态服务:

合同:

 [ServiceContract]
    public interface IPresidentialService
    {
        [OperationContract]
        Task<string> GetInfo();
    }

服务:

internal sealed class PresidentialService : StatelessService, IPresidentialService
{
    public PresidentialService(StatelessServiceContext context) : base(context)
    {
    }

    public Task<string> GetInfo() => Task.FromResult($"Node {Context.NodeContext.NodeName} operating");

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[]
        {
            new ServiceInstanceListener(context =>
                new WcfCommunicationListener<IPresidentialService>(wcfServiceObject: this, serviceContext: context,
                    endpointResourceName: "WcfServiceEndpoint",
                    listenerBinding: WcfUtility.CreateTcpListenerBinding()))
        };
    }
}

}

客户端控制台应用

WCF客户端:

public class PresidentialServiceClient : ServicePartitionClient<WcfCommunicationClient<IPresidentialService>>
    {
        public PresidentialServiceClient(
            ICommunicationClientFactory<WcfCommunicationClient<IPresidentialService>> communicationClientFactory,
            Uri serviceUri, ServicePartitionKey partitionKey = null,
            TargetReplicaSelector targetReplicaSelector = TargetReplicaSelector.Default, string listenerName = null,
            OperationRetrySettings retrySettings = null) : base(communicationClientFactory, serviceUri, partitionKey,
            targetReplicaSelector, listenerName, retrySettings)
        {
        }

        public Task<string> GetInfo() => InvokeWithRetryAsync(client => client.Channel.GetInfo());
    }

客户端应用:

private static void Main(string[] args)
        {
            var binding = WcfUtility.CreateTcpClientBinding();
            var partitionResolver = ServicePartitionResolver.GetDefault();
            var wcfClientFactory =
                new WcfCommunicationClientFactory<IPresidentialService>(binding,
                    servicePartitionResolver: partitionResolver);
            var serviceUri = new Uri("fabric:/Application5/PresidentialService");
            var client = new PresidentialServiceClient(wcfClientFactory, serviceUri, ServicePartitionKey.Singleton);
            do
            {
                Console.WriteLine(client.GetInfo().Result);
                Console.ReadKey();
            } while (true);
        }

已添加到ServiceManifest.xml

<Endpoints>
      <Endpoint Name="WcfServiceEndpoint" />
</Endpoints>

更新

更改了ServicePartitionResolver

var partitionResolver = new ServicePartitionResolver("sfapp.westeurope.cloudapp.azure.com:19000");

仍然无效。

更新

为TCP端口777添加了负载均衡器规则。

enter image description here

1 个答案:

答案 0 :(得分:1)

当服务在云中运行时,您无法使用默认解析程序。

  

默认的ServicePartitionResolver假设客户端是   在与服务相同的集群中运行。如果不是这样,   创建一个ServicePartitionResolver对象并传入集群   连接端点。

尝试something喜欢

ServicePartitionResolver resolver = new ServicePartitionResolver("mycluster.cloudapp.azure.com:19000");

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-wcf