2017-04-07 51 views
0

所以我写我的第一男主角的服务,我就遇到了这个错误MethodAccessException时到服务织物演员服务

System.MethodAccessException: Attempt by method 'Microsoft.ServiceFabric.Services.Remoting.Description.InterfaceDescription..ctor(System.String, System.Type, Microsoft.ServiceFabric.Services.Remoting.Description.MethodReturnCheck)' to access method 'Microsoft.ServiceFabric.Services.Common.IdUtil.ComputeId(System.Type)' failed. 
    at Microsoft.ServiceFabric.Services.Remoting.Description.InterfaceDescription..ctor(String remotedInterfaceKindName, Type remotedInterfaceType, MethodReturnCheck methodReturnCheck) 
    at Microsoft.ServiceFabric.Actors.Remoting.Builder.ActorCodeBuilder.<BuildProxyGenerator>b__5(Type t) 
    at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext() 
    at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) 
    at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyGeneratorBuilder`2.Build(Type proxyInterfaceType, IEnumerable`1 interfaceDescriptions) 
    at Microsoft.ServiceFabric.Services.Remoting.Builder.CodeBuilder.Microsoft.ServiceFabric.Services.Remoting.Builder.ICodeBuilder.GetOrBuildProxyGenerator(Type interfaceType) 
    at Microsoft.ServiceFabric.Actors.Remoting.Builder.ActorCodeBuilder.GetOrCreateProxyGenerator(Type actorInterfaceType) 
    at Microsoft.ServiceFabric.Actors.Client.ActorProxyFactory.CreateActorProxy[TActorInterface](Uri serviceUri, ActorId actorId, String listenerName) 
    at Microsoft.ServiceFabric.Actors.Client.ActorProxy.Create[TActorInterface](ActorId actorId, Uri serviceUri, String listenerName) 

我有一个演员的服务和无状态的Web API服务。在Web API控制器中,我试图获得像以下这样的演员手柄:

var actorServiceProxy = ActorProxy.Create<IPaymentActor>(ActorId.CreateRandom(), new Uri("fabric:/PaymentService/PaymentActorService")); 

这就是抛出异常的地方。任何想法为什么?

编辑:演员定义包括每个请求。 PaymentInfo对象标记为DataContract FWIW

public interface IPaymentActor : IActor 
{ 
    /// <summary> 
    /// TODO: Replace with your own actor method. 
    /// </summary> 
    /// <returns></returns> 
    Task<PaymentInfo> GetPaymentInformation(CancellationToken cancellationToken); 

    /// <summary> 
    /// TODO: Replace with your own actor method. 
    /// </summary> 
    /// <param name="count"></param> 
    /// <returns></returns> 
    Task SetPaymentInformation(PaymentInfo info, CancellationToken cancellationToken); 
} 
+1

你的演员界面是如何定义的?你可以发布吗? – yoape

+0

完成。如前所述,PaymentInfo对象及其属性标记为用于序列化目的的DataContract。 –

回答

0

我想通了。

与Microsoft.ServiceFabric.Actors库引用不匹配。

文件>新建项目>服务结构> Actor项目脚手架默认为v2.4.164包Microsoft.ServiceFabric.Actors。

但是,当我去添加一个web前端,并通过NuGet添加该项目时,它添加了最新的(在撰写本文时为v2.5.216)。这在RPC调用期间表现为库中的低级异常。我将向Service Fabric团队指出这一点,并希望他们能够提供更有意义的错误消息的检查。同时,如果你偶然发现了这个错误,请检查一下。

1

是的,这是正确的。 Microsoft.ServiceFabric.Services.Remoting是在2.5.216版本中添加的,它取决于Microsoft.ServiceFabric.Services.2.5.216 nuget包。所以一旦你升级了所有的nuget软件包,它就可以正常工作。