C# FabriceException:分区的主实例或无状态实例

C# FabriceException:分区的主实例或无状态实例,c#,.net,azure,visual-studio-2017,azure-service-fabric,C#,.net,Azure,Visual Studio 2017,Azure Service Fabric,以下是一份来自: 我得到以下例外情况: 毫无疑问,我的节点运行良好: 以下是如何设置我的无状态服务: internal sealed class MyStatelessService : StatelessService { public MyStatelessService(StatelessServiceContext context) : base(context) { } /// <summary

以下是一份来自:

我得到以下例外情况:

毫无疑问,我的节点运行良好:

以下是如何设置我的无状态服务:

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);
            }
        }
    }
内部密封类MyStatelessService:无状态服务
{
公共MyStatelessService(无状态服务上下文)
:基本(上下文)
{ }
/// 
///可选覆盖,用于为此服务副本创建侦听器(例如TCP、HTTP),以处理客户端或用户请求。
/// 
///听众的集合。
受保护的重写IEnumerable CreateServiceInstanceListeners()
{
返回新的ServiceInstanceListener[0];
}
/// 
///这是服务实例的主要入口点。
/// 
///当服务结构需要关闭此服务实例时取消。
受保护的覆盖异步任务RunAsync(CancellationToken CancellationToken)
{
//TODO:用您自己的逻辑替换以下示例代码
//或者,如果您的服务中不需要此RunAsync重写,请将其删除。
长迭代=0;
while(true)
{
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(this.Context,“Working-{0}”,++迭代);
等待任务延迟(TimeSpan.FromSeconds(1),cancellationToken);
}
}
}
我部署和获取此异常的方式:

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


可以查看整个解决方案

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


您需要从
CreateServiceInstanceListeners
返回一个侦听器,并实现
iSeries设备
当创建无状态服务时,您调用的是您的服务
MyStatelessService
而不是
CalculatorService
,调用的是您的应用程序
CalculatorService
计算器应用程序
。正如本书在“第一个版本”的步骤1中所述,“使用服务命名计算器服务创建一个新的服务结构应用程序命名计算器应用程序”。您创建了一个名为
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)) };
    }
}
内部密封类MyStatelessService:无状态服务,ICalculatorService
{
公共MyStatelessService(无状态serviceContext serviceContext):基(serviceContext)
{
}
公共任务添加(int a、int b)
{
返回任务.FromResult(a+b);
}
公共任务减法(整数a、整数b)
{
返回任务.FromResult(a-b);
}
受保护的重写IEnumerable CreateServiceInstanceListeners()
{
返回新[]{new ServiceInstanceListener(上下文=>this.CreateServiceRemotingListener(上下文))};
}
}
然而,将应用程序称为“服务”是非常规的,因此我建议创建一个新项目,并将当前实现粘贴到其中

创建新项目时,将应用程序命名为Calculator application

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

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

两件事:

  • 您的
    ICalculatorService
    必须在另一个库项目中定义,以便在无状态服务库和客户端项目之间共享。因此:

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

    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();
    }
    
    您引用的不是
    CalculatorService
    ,而是
    MyStatelessService

    ServiceRuntime.RegisterServiceAsync("MyStatelessServiceType",
        context => new CalculatorService(context)).GetAwaiter().GetResult();
    
    ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(CalculatorService).Name);