FabricException:分区的主要或无状态实例

时间:2017-05-19 04:04:59

标签: c# .net azure visual-studio-2017 azure-service-fabric

我正在关注来自tutorial[this book]enter image description here

我收到以下异常: enter image description here

毫无疑问,我的节点运行良好:enter image description here

以下是我的无状态服务的设置方式:

internal sealed class MyStatelessService : StatelessService
    {
        public MyStatelessService(StatelessServiceContext context)
            : base(context)
        { }

        /// <summary>
        /// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
        /// </summary>
        /// <returns>A collection of listeners.</returns>
        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
            return new ServiceInstanceListener[0];
        }


        /// <summary>
        /// This is the main entry point for your service instance.
        /// </summary>
        /// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            // TODO: Replace the following sample code with your own logic 
            //       or remove this RunAsync override if it's not needed in your service.

            long iterations = 0;

            while (true)
            {
                cancellationToken.ThrowIfCancellationRequested();

                ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations);

                await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
            }
        }
    }

我部署和获取此异常的方式:enter image description here

我做错了什么?如何将我的客户端连接到我的群集?

可以查看整个解决方案here.

3 个答案:

答案 0 :(得分:2)

您尝试通过远程处理来访问您的服务,但您的服务未启用远程处理。

您需要从CreateServiceInstanceListeners返回communication听众并实施IService

答案 1 :(得分:2)

两件事:

  1. 您的ICalculatorService必须在另一个图书馆项目中定义,以便在您的无状态服务库和您的客户项目之间共享。所以:

    • 创建新的库项目MyStatelessService.Interfaces
    • 添加NuGet包:Microsoft.ServiceFabric.Services.Remoting
    • 在此库中定义ICalculatorService
    • 从其他两个项目中删除ICalculatorService
    • 向您的客户端应用程序和无状态服务库添加对MyStatelessService.Interfaces的引用。
    • 修复对ICalculatorService
    • 的引用
    • 应该从同一个库中引用所有ICalculatorService
  2. 您的客户将是:

    using Microsoft.ServiceFabric.Services.Remoting.Client;
    using MyStatelessService.Interfaces;
    using System;
    
    static void Main(string[] args)
    {
        var calculatorClient = ServiceProxy.Create<ICalculatorService>
            (new Uri("fabric:/CalculatorService/MyStatelessService"));
    
        var result = calculatorClient.Add(1, 2).Result;
    
        Console.WriteLine(result);
        Console.ReadKey();
    }
    
    1. MyStatelessService语句后更改Program.cs try部分:

      ServiceRuntime.RegisterServiceAsync("MyStatelessServiceType",
          context => new CalculatorService(context)).GetAwaiter().GetResult();
      
      ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(CalculatorService).Name);
      
    2. 而不是CalculatorService,您引用的是MyStatelessService

答案 2 :(得分:0)

在创建无状态服务时,您调用了服务MyStatelessService而不是CalculatorService,并且您调用了应用CalculatorService而不是CalculatorApplication。正如本书在第一版&#39;第一版所述的第一步所述。 &#34;使用名为CalculatorService&#34;的服务创建名为CalculatorApplication的新Service Fabric 应用程序。您创建了一个名为CalculatorService的应用程序和一个名为MyStatelessService的服务。然后,您在无状态服务项目中创建了一个新的服务文件。您应该从不在服务中创建新服务。请改用生成的service.cs(在您的案例中为MyStatelessService.cs)文件。解决问题的一种方法是将CalculatorService的实现复制到无状态服务中并删除CalculatorService.cs。您的无国籍服务将是:

internal sealed class MyStatelessService: StatelessService, ICalculatorService
{
    public MyStatelessService(StatelessServiceContext serviceContext) : base(serviceContext)
    {

    }

    public Task<int> Add(int a, int b)
    {
        return Task.FromResult<int>(a + b);
    }

    public Task<int> Subtract(int a, int b)
    {
        return Task.FromResult<int>(a - b);
    }

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[] { new ServiceInstanceListener(context => this.CreateServiceRemotingListener(context)) };
    }
}

但是,调用应用程序&#39;服务是非常规的,因此我建议您创建一个新项目并将当前实现粘贴到其中。

创建新项目时,请为应用程序命名 CalculatorApplication Adding the application

然后使用名称 CalculatorService 创建服务。 Adding the service

您的CalculatorService.cs文件是自动生成的,因此只需将当前实现粘贴到其中即可。 (与上面的MyStatelessService相同,但名称为CalculatorService。)