我正在开发一个简单的 Service Fabric 群集,我想从无状态 ASP.NET Core 2.0 Web API 调用无状态服务。
我做的第一件事是创建一个带有简单接口和 DTO 的 .NET Standard 2.0 类库:
public interface IMicroService : IService
{
Task<MyDto> GetMahDto(int id);
}
public class MyDto
{
public string Name { get; set; }
}
然后我从中创建了一个 NuGet 包,并将该包作为依赖项添加到我的 Web API(MyServiceApi 项目)和无状态服务(MyService)。
服务的监听器定义为
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
var fabricListener = new ServiceInstanceListener((context) =>
{
var fabricRemotingListener = new FabricTransportServiceRemotingListener(
serviceContext: context,
serviceRemotingMessageHandler: null,
remotingListenerSettings: new Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime.FabricTransportRemotingListenerSettings()
{
EndpointResourceName = "myendpoint"
},
serializationProvider: null);
return fabricRemotingListener;
},
"mylistener");
return new ServiceInstanceListener[] { fabricListener };
}
接口实现很简单
public Task<MyDto> GetMahDto(int id)
{
return Task.FromResult(new MyDto() { Name=$"Hallo from TheService in FabricSandbox3 project, id: {id}" });
}
在 MyServiceApi 中,我有一个控制器方法,看起来像
[HttpGet]
public async Task<MyDto> Get()
{
var svc = ServiceProxy.Create<ContractsStandard.IMicroService>(new Uri("fabric:/FabricSandbox4/TheService"), listenerName: "mylistener");
return await svc.GetMahDto(23);
}
当我启动调试器时,我可以进入 MyServiceApi 的控制器方法,但它会抛出以下异常:
System.AggregateException: '发生一个或多个错误。(异常 System.ArgumentException 在服务上未处理,无法序列化以传输到客户端。详细的远程异常信息:System.ArgumentException:在 Microsoft.ServiceFabric.Services.Remoting.V2 上找不到具有此 ID -488762776 的接口。 ServiceRemotingMessageSerializersManager.GetInterfaceDetails(Int32 interfaceId) 在 Microsoft.ServiceFabric.Services.Remoting.V2.ServiceRemotingMessageSerializersManager.CreateSerializers(Int32 interfaceId) 在 System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func
2 valueFactory) 在 Microsoft.ServiceFabric.Services.Remoting.V2.FabricTransport.Runtime.FabricTransportMessageHandler.CreateRemotingRequestMessage(FabricTransportMessage fabricTransportMessage, Stopwatch stopwatch) 在 Microsoft.ServiceFabric.Services.GetRequestBodySerializer(Int32 interfaceId) 在 Microsoft.ServiceFabric .Services.Remoting.V2.FabricTransport.Runtime.FabricTransportMessageHandler.d__7.MoveNext())'
我在我的诊断事件中没有发现任何看起来很有希望的东西,而且我看到的类似问题的唯一提及(在这个站点和其他地方)通常涉及不同程序集中的类型,这不是问题,因为共享接口包含在 NuGet 包中。
有什么想法我可能会在这里出错吗?