dotnet / aspnetcore

ASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.
https://asp.net
MIT License
35.05k stars 9.89k forks source link

Using SignalR core with Unity and IL2CPP (AOT) #12102

Open thorgeirk11 opened 5 years ago

thorgeirk11 commented 5 years ago

I am having a similar issue as #10080. I am using preview 6 of asp.net core SignalR client inside of unity and compiling with IL2CPP. I created a small git repo with the code I use to reproduce this issue

I am running into an exception when starting the connection:

connection = new HubConnectionBuilder()
   .WithUrl("http://localhost:5000/gamehub")
   .Build(); // works fine

await connection.StartAsync(); // takes a few sec before failing

The connection.StartAsync fails with the following exception:

InvalidDataException: Missing required property 'connectionId'.
  at Microsoft.AspNetCore.Http.Connections.NegotiateProtocol.ParseResponse (System.ReadOnlySpan`1[T] content)

Unity's IL2CPP strips unused assemblies. It caused another issue but I fixed that by adding link.xml file. So the issue described here should not be affected by code stripping.

Here are the server and client traces.

BrennanConroy commented 5 years ago

I don't currently have unity on any of my work machines, but I might try this out on a personal machine to see if I can figure anything out.

Meanwhile, is it possible for you to grab the network trace so we can verify what payload the client is receiving from the server?

thorgeirk11 commented 5 years ago

@BrennanConroy I am not sure how to take a network trace. I set both of my server and client to verbose debug logging. The logs are included in the git repo above (server and client)

If I can provide better traces please let me know how :)

Also of note, when I build with the mono runtime the handshake succeeds. I would guess this is a client side error instead of server side.

Thanks for the help!

analogrelay commented 5 years ago

@thorgeirk11 We have some guidance on network traces here: https://docs.microsoft.com/en-us/aspnet/core/signalr/diagnostics?view=aspnetcore-2.2

InvalidDataException: Missing required property 'connectionId'.

This indicates that the response from the server is incorrect (missing a required property). Can you provide a sample response from the localhost:5000/gamehub/negotiate endpoint (you can just use a browser to do this).

thorgeirk11 commented 5 years ago

Unity apparently doesn't play well with fiddler so after testing out different tools I managed to get a network trace through WireShark. See NetworkTraces.zip

As far as I can see both the IL2CPP and Mono receive the same response.

Request:

POST /gamehub/negotiate HTTP/1.1
User-Agent: Microsoft.AspNetCore.Http.Connections.Client/3.0.0-preview6.19307.2
X-Requested-With: XMLHttpRequest
Content-Length: 0
Connection: keep-alive
Host: signalr-il2cpp-test.azurewebsites.net

Response:

HTTP/1.1 200 OK
Content-Length: 252
Content-Type: application/json
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=cfe9d88b4d05c4f99a90649b783196ca671405478765ab764374675d71877225;Path=/;HttpOnly;Domain=signalr-il2cpp-test.azurewebsites.net
Date: Wed, 17 Jul 2019 18:40:52 GMT

{"connectionId":"5wLJLrzOr3q7VfCRrGx-7w","availableTransports":[{"transport":"WebSockets","transferFormats":["Text","Binary"]},{"transport":"ServerSentEvents","transferFormats":["Text"]},{"transport":"LongPolling","transferFormats":["Text","Binary"]}]}

Can you investigate if the deserialization mechanism is AOT (IL2CPP) compatible? Unity has wide adoption of IL2CPP and on some platform that is the only scripting runtime available, such as iOS and WebGL.

Please let me know if I can provide more info, check out the git repo for my simple project that reproduces this error.

BrennanConroy commented 5 years ago

I haven't gotten the chance to try out the repo project yet (thanks for that btw!).

I did take a glance at the project though, and how does it know what version of the client to download and use?

Also, could you try to replace the json protocol to use Newtonsoft and see if it works with that?

Here are the steps to switch to newtonsoft, note you need to add another package (for the link.xml file).

crevelop commented 4 years ago

@thorgeirk11 any update/success connecting from IL2CPP Unity client?

Sort of having the same issue ages ago and decided to use a plugin from the AssetStore by then.

But really looking fwd to using asp.net core SignalR client straight into Unity instead.

aL3891 commented 4 years ago

We would also really like to use the official signalR client in unity

thorgeirk11 commented 4 years ago

@crevelop Nope not yet, I guess the problem would be solved by switching out the serializer for an AOT friendly implementation. I have not spent much time on it. The game I am working on is on standalone and currently using Mono. However, in the coming months, I would like the option to switch to IL2CPP to export to WebGL.

parkycai commented 4 years ago

You may need to use Linker.xml to avoid field stripping

thorgeirk11 commented 4 years ago

Check out my repo. I induded a Linker.xml for all of the SignalR binaries.

samoteph commented 4 years ago

Hello @thorgeirk11 ! Is the SignalR core running with Unity finally ? I would like to integrate it on Hololens but at this time I've not found any documentation to do this. You are my last hope :)

thorgeirk11 commented 4 years ago

@samoteph It works out of the box for any platform that does not require IL2CPP.
However, it appears that MessagePack supports IL2CPP platforms. I will have to test it out for myself, but it looks promising.

neal2018 commented 4 years ago

We also encounter this problem : ( Hope that it will get fixed.

jhofer commented 4 years ago

@samoteph It works out of the box for any platform that does not require IL2CPP. However, it appears that MessagePack supports IL2CPP platforms. I will have to test it out for myself, but it looks promising.

Did you have any luck with messagepack?

samoteph commented 4 years ago

Finally, I rewrote my own sharing service with WebSocket as a communication channel

samuelgoldenbaum commented 4 years ago

Anyone get messagepack working? I added an entry to my link.xml file to the Microsoft.AspNetCore.SignalR.Protocols.MessagePack.dll, but I get missing constructor error.

thorgeirk11 commented 4 years ago

Yeah, we are currently using Messagepack successfully

samuelgoldenbaum commented 4 years ago

Yeah, we are currently using Messagepack successfully

@thorgeirk11 great to hear - to confirm: are you using it with IL2CPP (iOS)?

After downloading v3.1.2, I have extracted the netstandard2.0 Microsoft.AspNetCore.SignalR.Protocols.MessagePack.dll

I then added an additional entry in my link.xml file as follows: <assembly fullname="Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol" preserve="all"/>

Yet when I run it on a device, I get the following error:

InvalidOperationException: A suitable constructor for type 'Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
  at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite (Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache lifetime, System.Type serviceType, System.Type implementationType, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain callSiteChain) [0x00000] in <00000000000000000000000000000000>:0 

Could you list the steps you guys are taking to get it working in your project?

My link.xml file:

<linker>
    <assembly fullname="System.Core">
        <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
    </assembly>
    <assembly fullname="MessagePack" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.Connections.Abstractions" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.Http.Features" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Common" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.DependencyInjection.Abstractions" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Options" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Primitives" preserve="all"/>
    <assembly fullname="System.Buffers" preserve="all"/>
    <assembly fullname="System.IO.Pipelines" preserve="all"/>
    <assembly fullname="System.Memory" preserve="all"/>
    <assembly fullname="System.Numerics.Vectors" preserve="all"/>
    <assembly fullname="System.Runtime.CompilerServices.Unsafe" preserve="all"/>
    <assembly fullname="System.Threading.Tasks.Extensions" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.Http.Connections.Client" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.Http.Connections.Common" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Client.Core" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Client" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Protocols.Json" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Configuration.Abstractions" preserve="all"/> 
    <assembly fullname="Microsoft.Extensions.Configuration.Binder" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Configuration" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.DependencyInjection" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Logging.Abstractions" preserve="all"/>
    <assembly fullname="Microsoft.Extensions.Logging" preserve="all"/>
    <assembly fullname="System.ComponentModel.Annotations" preserve="all"/>
    <assembly fullname="System.Text.Json" preserve="all"/>
    <assembly fullname="System.Threading.Channels" preserve="all"/>
    <assembly fullname="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" preserve="all"/>
</linker>
thorgeirk11 commented 4 years ago

Ah I have yet to Port my project over to IL2CPP however I assume to get that working you would have to pre-compile a message pack parser.

samuelgoldenbaum commented 4 years ago

Ah I have yet to Port my project over to IL2CPP however I assume to get that working you would have to pre-compile a message pack parser.

Works fine under mono - but iOS now only allows IL2CPP which is the stumbling block.

Could you advise on process to pre-compile a message pack parser.

thorgeirk11 commented 4 years ago

Take a look at https://github.com/neuecc/MessagePack-CSharp#aot

samuelgoldenbaum commented 4 years ago

Take a look at https://github.com/neuecc/MessagePack-CSharp#aot

Thanks, been trying to get this running but no luck. Let me know if you get it working with IL2CPP.

davidfowl commented 4 years ago

Has anyone gotten this to work?

samuelgoldenbaum commented 4 years ago

Has anyone gotten this to work?

Yes, but not with messagepack on IL2CPP.

davidfowl commented 4 years ago

@samuelgoldenbaum what’s your environment?

thorgeirk11 commented 4 years ago

I am currently in the process of porting my project over to use a precompiled message pack formatter and IL2CPP

I encountered this issue but have yet to see if the solution pointed out works.

thorgeirk11 commented 4 years ago

Just for reference, I just created an issue on the MessagePack Repo.

MessagePack.dll is not supported in IL2CPP and the two solutions don't work well together.

@davidfowl ⬆️ Don't know who should take lead on fixing this because of the interplay between SignalR and Messagepack :shrug:

lwuLok commented 4 years ago

Hey. Are there any updates regarding this issue? I would like to use unity as a frontend for a UWP AR application. However using AspNetCore.SignalR somehow only works in the Unity editor, but not the UWP build. Funny thing, while I use a similiar approach as @thorgeirk11 in his original statement, I do not receive any exception at all.

ghost commented 4 years ago

Thanks for contacting us. We're moving this issue to the Next sprint planning milestone for future evaluation / consideration. We will evaluate the request when we are planning the work for the next milestone. To learn more about what to expect next and how this issue will be handled you can read more about our triage process here.

breynolds commented 3 years ago

Whenever there's an update on this, we'd be happy to help test. Have a decent size environment with 10K concurrent users 1M daily that has worked well with SignalR for realtime info on the web. Would like to use same backend within Unity on iOS/Android.

ghost commented 3 years ago

Thanks for contacting us. We're moving this issue to the Next sprint planning milestone for future evaluation / consideration. We will evaluate the request when we are planning the work for the next milestone. To learn more about what to expect next and how this issue will be handled you can read more about our triage process here.

seriouz commented 3 years ago

Any news on this? My comp would like to use SignalR Core with Unity, too. Edit: I saw that https://github.com/neuecc/MessagePack-CSharp/issues/973 was fixed. So does this work now?

davidfowl commented 3 years ago

We haven't done any testing on Unity. If you would like to help us out by testing with those changes, that would be great.

BrennanConroy commented 3 years ago

Brain dump:

IL2CPP:

MessagePack:

System.Text.Json:

General:

davidfowl commented 3 years ago

cc @jkotas for awareness (AOT stuff)

neuecc commented 3 years ago

You make it sound like there's a problem with MessagePack, but it's hard to run a library that doesn't consider to Unity. My MagicOnion has a complete AOT generator for Unity and providing a SignalR-like API.

davidfowl commented 3 years ago

@neuecc It wasn't meant to sound as if MessagePack is a problem, @BrennanConroy was just exploring the space and posting his findings. If we misrepresented MessagePack-CSharp in anyway please correct it so we can learn (this is a learning experience for us).

To your other point this is correct, we haven't historically been AOT friendly but that's one of the things we plan to work on going forward (as a strategy), which is why it's important to understand the current warts (which we have some basic idea of)

WalternativE commented 3 years ago

@davidfowl regarding my past experiences with using SignalR in Unity I'd second the statement of @neuecc. It is really hard to use any .NET library, that wasn't meant to be used in Unity. Apart from not always playing super nice with IL2CPP the .NET SignalR client pulls in a quite sizable amount of ASP.NET Core dependencies. That works fine for anything that uses NuGet but it falls flat in Unity (afaik the Unity package manger has no NuGet interop). If it is the goal to write a Unity client for SignalR I'd basically treat it as I would any non CLR language (like Java, JS, etc) and don't try to force the conventional client into an environment where it is setup for failure.

jwittner commented 3 years ago

As a work around, while not free, Best HTTP/2 is a great package on the Unity Asset Store which supports SignalR Core out of the box. I'm using it in a UWP/IL2CPP/HoloLens application to connect to an Azure SignalR Service with great success.

youtpout commented 3 years ago

Hello, finally I can use SignalR on mobile with link.xml, but If i use enum in my model, the connection.On method in my client is never call, no problem on Unity editor. If I replace enum by int it's work on both.

jwittner commented 3 years ago

@youtpout - mind sharing more details about your working setup? E.g. the link.xml file, how you configured the dlls, etc. Would love to get this working for us too. =)

youtpout commented 3 years ago

Exemple of project who works with enum in editor but not in IL2CPP mobile https://github.com/youtpout/SignalREnum https://github.com/youtpout/UnityEnum

@jwittner see UnityEnum, you have plugins folder with all files who works for me

xabio commented 3 years ago

@youtpout how do you workaround the fact that sígnalr only works with 11.0.0 version of newtonsoft.json? I am facing that issue. I try to use the one ported to unity ecosystem but without luck(it is based on 12.0.0) Thanks

youtpout commented 3 years ago

@xabio I use v12 without problem, see my project test plugins folder https://github.com/youtpout/UnityEnum/tree/master/Assets/Plugins

xabio commented 3 years ago

@youtpout And how did you managed to do that? last version of signalr depends on netwonsoft 11.0.0 right? Did you managed to recompile it or how? Please your help is really important, I am really desesperated

youtpout commented 3 years ago

@xabio My bad, SignalR use textjson I think https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Common/ Dependencies .NETStandard 2.0 Microsoft.AspNetCore.Connections.Abstractions (>= 5.0.3) Microsoft.Extensions.Options (>= 5.0.0) System.Text.Json (>= 5.0.1)

I include Newtosoft because I use HttpClient for rest api call on my real project.

MGG2020 commented 3 years ago

Has anyone solved the problem with IL2CPP and SignalR Core?

youtpout commented 3 years ago

Has anyone solved the problem with IL2CPP and SignalR Core?

I can use SignalR Core with IL2CPP, the only problem for me is to use Messagepack...

See my project SignalREnum and UnityEnum

michalpypek commented 3 years ago

SignalR uses MessagePack in an unsupported way on Unity + IL2CPP: it uses the nongeneric serialization method with signature: public static void Serialize(Type type, ref MessagePackWriter writer, object obj, MessagePackSerializerOptions options = null) and the nongeneric deserialization method with signature: public static object Deserialize(Type type, ref MessagePackReader reader, MessagePackSerializerOptions options = null)

both of which are unsupported when building with IL2CPP.

1.See the lines on MessagePack's repository: https://github.com/neuecc/MessagePack-CSharp/blob/1551f9344c28e822f08f3a00971ddb26229e5910/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackSerializer.NonGeneric.cs#L247

https://github.com/neuecc/MessagePack-CSharp/blob/1551f9344c28e822f08f3a00971ddb26229e5910/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackSerializer.NonGeneric.cs#L225

2.Notice that the SignalR code is calling both of them: https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/common/Protocols.MessagePack/src/Protocol/DefaultMessagePackHubProtocolWorker.cs

3.SignalR won't work with MessagePack built with IL2CPP

NotSupportedException: MessagePackWriter/Reader overload is not supported in MessagePackSerializer.NonGenerics.
  at MessagePack.MessagePackSerializer+CompiledMethods.ThrowRefStructNotSupported () [0x00000] in <00000000000000000000000000000000>:0 
  at MessagePack.MessagePackSerializer+CompiledMethods+<>c.<.ctor>b__13_4 (MessagePack.MessagePackWriter& x, System.Object y, MessagePack.MessagePackSerializerOptions z) [0x00000] in <00000000000000000000000000000000>:0 
  at MessagePack.MessagePackSerializer+CompiledMethods+MessagePackWriterSerialize.Invoke (MessagePack.MessagePackWriter& writer, System.Object value, MessagePack.MessagePackSerializerOptions options) [0x00000] in <00000000000000000000000000000000>:0 
  at MessagePack.MessagePackSerializer.Serialize (System.Type type, MessagePack.MessagePackWriter& writer, System.Object obj, MessagePack.MessagePackSerializerOptions options) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.DefaultMessagePackHubProtocolWorker.Serialize (MessagePack.MessagePackWriter& writer, System.Type type, System.Object value) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocolWorker.WriteArgument (System.Object argument, MessagePack.MessagePackWriter& writer) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocolWorker.WriteInvocationMessage (Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage message, MessagePack.MessagePackWriter& writer) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocolWorker.WriteMessageCore (Microsoft.AspNetCore.SignalR.Protocol.HubMessage message, MessagePack.MessagePackWriter& writer) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocolWorker.WriteMessage (Microsoft.AspNetCore.SignalR.Protocol.HubMessage message, System.Buffers.IBufferWriter`1[T] output) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol.WriteMessage (Microsoft.AspNetCore.SignalR.Protocol.HubMessage message, System.Buffers.IBufferWriter`1[T] output) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.SendHubMessage (Microsoft.AspNetCore.SignalR.Client.HubConnection+ConnectionState connectionState, Microsoft.AspNetCore.SignalR.Protocol.HubMessage hubMessage, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.SendHubMessage (Microsoft.AspNetCore.SignalR.Client.HubConnection+ConnectionState connectionState, Microsoft.AspNetCore.SignalR.Protocol.HubMessage hubMessage, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCore (Microsoft.AspNetCore.SignalR.Client.HubConnection+ConnectionState connectionState, System.String methodName, Microsoft.AspNetCore.SignalR.Client.Internal.InvocationRequest irq, System.Object[] args, System.String[] streams, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCore (Microsoft.AspNetCore.SignalR.Client.HubConnection+ConnectionState connectionState, System.String methodName, Microsoft.AspNetCore.SignalR.Client.Internal.InvocationRequest irq, System.Object[] args, System.String[] streams, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore (System.String methodName, System.Type returnType, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore (System.String methodName, System.Type returnType, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync (System.String methodName, System.Type returnType, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync (System.String methodName, System.Type returnType, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnectionExtensions.InvokeCoreAsync[TResult] (Microsoft.AspNetCore.SignalR.Client.HubConnection hubConnection, System.String methodName, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnectionExtensions.InvokeCoreAsync[TResult] (Microsoft.AspNetCore.SignalR.Client.HubConnection hubConnection, System.String methodName, System.Object[] args, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnectionExtensions.InvokeAsync[TResult] (Microsoft.AspNetCore.SignalR.Client.HubConnection hubConnection, System.String methodName, System.Object arg1, System.Threading.CancellationToken cancellationToken) [0x00000] in <00000000000000000000000000000000>:0 
thorgeirk11 commented 3 years ago

@BrennanConroy @davidfowl this issue is still causing problems. @michalpypek has digged into the cause of the problem.

Can you please take a look at this issue before .net 6 arrives. Our game is using SignalR and MessagePack to great effect and this issue is preventing us form using this stack for an IL2CPP mobile game.