Azure service fabric 服务结构中的自定义侦听器&x2B;如何从客户端访问?

Azure service fabric 服务结构中的自定义侦听器&x2B;如何从客户端访问?,azure-service-fabric,Azure Service Fabric,实际上,我正在尝试学习服务结构及其自定义侦听器部分。为此,我创建了一个示例服务Fabric Stateful服务,它只返回一个数字10 internal sealed class StatefulService1 : StatefulService, INumber { protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() {

实际上,我正在尝试学习服务结构及其自定义侦听器部分。为此,我创建了一个示例服务Fabric Stateful服务,它只返回一个数字10

internal sealed class StatefulService1 : StatefulService, INumber
{

    protected override IEnumerable<ServiceReplicaListener> 
    CreateServiceReplicaListeners()
    {
        return new[] { new ServiceReplicaListener(context => new 
        HttpCommunicationListener(context), "HttpListener") };
    }

    public int GetNumber()
    {
        return 10;
    }
}
客户端工厂impl:

class CustomCommunicationClientFactory : CommunicationClientFactoryBase<CustomCommunicationClient>
{
    ResolvedServicePartition partition;

    public CustomCommunicationClientFactory(ResolvedServicePartition partition)
    {
        this.partition = partition;
    }

    protected override void AbortClient(CustomCommunicationClient client)
    {
    }

    protected override Task<CustomCommunicationClient> CreateClientAsync(string endpoint, CancellationToken cancellationToken)
    {
        return Task.FromResult(new CustomCommunicationClient(this.partition));
    }

    protected override bool ValidateClient(CustomCommunicationClient client)
    {
        return true;
    }

    protected override bool ValidateClient(string endpoint, CustomCommunicationClient client)
    {
        return true;
    }
}
类CustomCommunicationClientFactory:CommunicationClientFactoryBase
{
解析服务划分;
公共CustomCommunicationClient工厂(ResolvedServicePartition分区)
{
this.partition=分区;
}
受保护的覆盖无效中止客户端(CustomCommunicationClient客户端)
{
}
受保护的覆盖任务CreateClientSync(字符串端点,CancellationToken CancellationToken)
{
返回Task.FromResult(新的CustomCommunicationClient(this.partition));
}
受保护的覆盖bool ValidateClient(CustomCommunicationClient客户端)
{
返回true;
}
受保护的覆盖bool ValidateClient(字符串端点、CustomCommunicationClient客户端)
{
返回true;
}
}
Main.cs

class Program
{
    private static string ServiceName = "fabric:/CustomCommunication.StatefulService/StatefulService1";

    static void Main(string[] args)
    {
        var servicePartition = GetServicePartitionAsync();
        var clientFactory = new CustomCommunicationClientFactory(servicePartition.Result);

        var partition = new ServicePartitionKey(1);
        var myServicePartitionClient = new ServicePartitionClient<CustomCommunicationClient>(clientFactory,
                                       new Uri(ServiceName), partition);
        Console.WriteLine("Running request client...");

        //var result =
        //    myServicePartitionClient.InvokeWithRetryAsync(client => client., CancellationToken.None).Result;

        Console.ReadKey();
    }

    private static Task<ResolvedServicePartition> GetServicePartitionAsync()
    {
        ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();

        Task<ResolvedServicePartition> partition = resolver.ResolveAsync(new Uri(ServiceName), 
                                             new ServicePartitionKey(1), CancellationToken.None);

        return partition;
    }
}
类程序
{
私有静态字符串ServiceName=“fabric:/CustomCommunication.StatefulService/StatefulService1”;
静态void Main(字符串[]参数)
{
var servicePartition=GetServicePartitionAsync();
var clientFactory=新的CustomCommunicationClientFactory(servicePartition.Result);
var partition=newservicepartitionkey(1);
var myServicePartitionClient=新的ServicePartitionClient(clientFactory,
新Uri(ServiceName)、分区);
WriteLine(“正在运行的请求客户端…”);
//var结果=
//myServicePartitionClient.InvokeWithRetryAsync(client=>client.,CancellationToken.None);
Console.ReadKey();
}
私有静态任务GetServicePartitionAsync()
{
ServicePartitionResolver解析器=ServicePartitionResolver.GetDefault();
任务分区=resolver.resolveaxync(新Uri(ServiceName),
新ServicePartitionKey(1),CancellationToken.None);
返回分区;
}
}

有人能告诉我怎么做吗?如果有人能给我一个代码,那就太好了。

你看到了吗:?谢谢你回复@LoekD。我想知道定制http侦听器如何与服务结构一起工作,以及客户端如何访问服务公开的功能。请对此稍作说明。看看这个示例:它显示了一个调用服务总线的实现,但您可以将其更改为使用HttpClient调用API。您可以将返回的JSON反序列化到一个对象中。
class CustomCommunicationClientFactory : CommunicationClientFactoryBase<CustomCommunicationClient>
{
    ResolvedServicePartition partition;

    public CustomCommunicationClientFactory(ResolvedServicePartition partition)
    {
        this.partition = partition;
    }

    protected override void AbortClient(CustomCommunicationClient client)
    {
    }

    protected override Task<CustomCommunicationClient> CreateClientAsync(string endpoint, CancellationToken cancellationToken)
    {
        return Task.FromResult(new CustomCommunicationClient(this.partition));
    }

    protected override bool ValidateClient(CustomCommunicationClient client)
    {
        return true;
    }

    protected override bool ValidateClient(string endpoint, CustomCommunicationClient client)
    {
        return true;
    }
}
class Program
{
    private static string ServiceName = "fabric:/CustomCommunication.StatefulService/StatefulService1";

    static void Main(string[] args)
    {
        var servicePartition = GetServicePartitionAsync();
        var clientFactory = new CustomCommunicationClientFactory(servicePartition.Result);

        var partition = new ServicePartitionKey(1);
        var myServicePartitionClient = new ServicePartitionClient<CustomCommunicationClient>(clientFactory,
                                       new Uri(ServiceName), partition);
        Console.WriteLine("Running request client...");

        //var result =
        //    myServicePartitionClient.InvokeWithRetryAsync(client => client., CancellationToken.None).Result;

        Console.ReadKey();
    }

    private static Task<ResolvedServicePartition> GetServicePartitionAsync()
    {
        ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();

        Task<ResolvedServicePartition> partition = resolver.ResolveAsync(new Uri(ServiceName), 
                                             new ServicePartitionKey(1), CancellationToken.None);

        return partition;
    }
}