2017-04-07 62 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軟件包,它就可以正常工作。