dotnet / dotnet/orleans

[3.x] Failsafe exception serialization not working

Open
#7,877 1 comment 0 reactions 1 assignee Claimed by @ReubenBond View on GitHub
area-serialization
Dominant language
C#
Stars
10.9k
Forks
2.1k
Avg merge
13h 56m
Merged PRs (30d)
351

Description

I have a custom exception that my grain will sometimes get thrown.
The type is unknown to the client though.
Right now when the client receives this exception it will blow up and throw a `FileNotFoundException` cause it doesn't have that assembly available.

```
System.IO.FileNotFoundException: Could not load file or assembly 'Services.Email.Interfaces, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'Services.Email.Interfaces, Culture=neutral, PublicKeyToken=null'
at System.Reflection.RuntimeAssembly.InternalLoad(ObjectHandleOnStack assemblyName, ObjectHandleOnStack requestingAssembly, StackCrawlMarkHandle stackMark, Boolean throwOnFileNotFound, ObjectHandleOnStack assemblyLoadContext, ObjectHandleOnStack retAssembly)
at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
at Orleans.Runtime.CachedTypeResolver.<>c__DisplayClass7_0.g__ResolveAssembly|0(AssemblyName assemblyName) in /_/src/Orleans.Core/AssemblyLoader/CachedTypeResolver.cs:line 89
at System.TypeNameParser.ResolveAssembly(String asmName, Func`2 assemblyResolver, Boolean throwOnError, StackCrawlMark& stackMark)
at System.TypeNameParser.ConstructType(Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
at System.TypeNameParser.GetType(String typeName, Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark)
at System.Type.GetType(String typeName, Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError)
at Orleans.Runtime.CachedTypeResolver.TryPerformUncachedTypeResolution(String fullName, Type& type, Assembly[] assemblies) in /_/src/Orleans.Core/AssemblyLoader/CachedTypeResolver.cs:line 62
at Orleans.Runtime.CachedTypeResolver.TryPerformUncachedTypeResolution(String name, Type& type) in /_/src/Orleans.Core/AssemblyLoader/CachedTypeResolver.cs:line 36
at Orleans.Runtime.CachedTypeResolver.TryResolveType(String name, Type& type) in /_/src/Orleans.Core/AssemblyLoader/CachedTypeResolver.cs:line 27
at Orleans.Serialization.TypeSerializer.GetTypeFromName(String assemblyQualifiedTypeName, Boolean throwOnError) in /_/src/Orleans.Core/Serialization/TypeSerializer.cs:line 108
at Orleans.Serialization.ILBasedExceptionSerializer.Deserialize(Type expectedType, IDeserializationContext outerContext) in /_/src/Orleans.Core/Serialization/ILBasedExceptionSerializer.cs:line 172
at Orleans.Serialization.ILBasedSerializer.Deserialize(Type expectedType, IDeserializationContext context) in /_/src/Orleans.Core/Serialization/ILBasedSerializer.cs:line 143
at Orleans.Serialization.SerializationManager.FallbackDeserializer(IDeserializationContext context, Type expectedType) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1686
at Orleans.Serialization.SerializationManager.DeserializeInner[TContext,TReader](SerializationManager sm, Type expected, TContext context, TReader reader) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1283
at Orleans.Serialization.SerializationManager.DeserializeInner(Type expected, IDeserializationContext context) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1247
at Orleans.Serialization.BuiltInTypes.DeserializeOrleansResponse(Type expected, IDeserializationContext context) in /_/src/Orleans.Core/Serialization/BuiltInTypes.cs:line 2135
at Orleans.Serialization.SerializationManager.DeserializeInner[TContext,TReader](SerializationManager sm, Type expected, TContext context, TReader reader) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1349
at Orleans.Runtime.Messaging.MessageSerializer.OrleansSerializer`1.Deserialize(ReadOnlySequence`1 input, T& value) in /_/src/Orleans.Core/Messaging/MessageSerializer.cs:line 151
at Orleans.Runtime.Messaging.MessageSerializer.TryRead(ReadOnlySequence`1& input, Message& message) in /_/src/Orleans.Core/Messaging/MessageSerializer.cs:line 76
at Orleans.Runtime.Messaging.Connection.ProcessIncoming() in /_/src/Orleans.Core/Networking/Connection.cs:line 358
at Orleans.Internal.OrleansTaskExtentions.g__ConvertAsync|4_0[T](Task`1 asyncTask) in /_/src/Orleans.Core/Async/TaskExtensions.cs:line 101
at Apis.App.Controllers.V2.AuthenticationSessionsController.CreateSession(CreateSessionResource body) in C:\Users\BenHanna\source\repos\platform\backend\src\Apis.App\Controllers\V2\AuthenticationSessionsController.cs:line 118
at lambda_method6(Closure , Object )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.HandleException(HttpContext context, ExceptionDispatchInfo edi)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
```

Based on what I've read though there is a failsafe exception serialization that should actually be returning a `RemoteNonSerializableException` in this case.

I am using the `ILBasedSerializer` so it seems like there's something broke here with this feature.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.