Just upgraded to 1.3.0 and am having issue with generic grains.
An example interface and class that's showing this issue:
public interface IGenericTest<T> : IGrainWithIntegerKey
{
Task<T> PrintType(T obj);
}
public class GenericTestGrain<T> : Grain, IGenericTest<T>
{
public Task<T> Print(T obj)
{
Debug.WriteLine("TEST");
return Task.FromResult(obj);
}
}
then using it like:
var grain = await GrainFactory.GetGrain<IGenericTest<int>>(0); // Runs without error.
await grain.Print(1);
Getting the grain seems to be fine, but when I call the method on the grain I get:
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Orleans.InterceptedMethodInvokerCache.GetInterfaceToImplementationMap(Int32 interfaceId, Type implementationType)
at Orleans.InterceptedMethodInvokerCache.CreateInterceptedMethodInvoker(Type implementationType, Int32 interfaceId, IGrainMethodInvoker invoker)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Orleans.InterceptedMethodInvokerCache.GetOrCreate(Type implementationType, Int32 interfaceId, IGrainMethodInvoker invoker)
at Orleans.Runtime.InsideRuntimeClient.InvokeWithInterceptors(IAddressable target, InvokeMethodRequest request, IGrainMethodInvoker invoker)
at Orleans.Runtime.InsideRuntimeClient.<Invoke>d__57.MoveNext()
Is there something I'm missing? Maybe some new configuration? This worked fine with the previous version I was using.
EDIT:
Seems like it's an issue with the invoke interceptor:
providerRuntime.SetInvokeInterceptor((method, request, grain, invoker) => { return invoker.Invoke(grain, request); });
When that's removed everything works.
问题在这里得到解答: https : //github.com/dotnet/orleans/issues/2358这是一个错误。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.