簡體   English   中英

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

[英]Service Fabric service with WCF communication deployment

這是一個帶有 WCF 通信的簡單 Service Fabric 無狀態服務,它是一個客戶端 - 一個控制台應用程序。 它在本地集群上運行良好,客戶端從服務獲得響應。 但是如果我將它部署在雲中,我不知道如何與服務通信。 我應該怎么做才能從控制台應用程序訪問它?

SF 無狀態服務與 WCF 通信:

合同:

 [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 添加了負載均衡器規則。

在此處輸入圖片說明

當服務在雲中運行時,您無法使用默認解析器。

默認的 ServicePartitionResolver 假定客戶端與服務在同一個集群中運行。 如果不是這種情況,請創建一個 ServicePartitionResolver 對象並傳入集群連接端點。

嘗試類似的東西

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM