dotnet-sdk icon indicating copy to clipboard operation
dotnet-sdk copied to clipboard

Cryptic and un-actionable error message when actor interfaces do not match

Open rynowak opened this issue 4 years ago • 5 comments

Expected Behavior

A mismatch in actor interface contracts can be reported in a way that makes sense.

Actual Behavior

Having a mismatch in details like what namespace an interface or DTO is declared in results in a cryptic error message.

 No interface found with this Id 403064080

This error can't really be reasoned about since it's a generated checksum. Fixing the problem is a matter of trial and error. I don't have in my head yet a clear picture of what exactly has to match for communication to work properly.

It seems like the best way (right now) to use actors with Dapr is to rely on binary dependencies to share contracts. This fights with the rationale for using microservices in the first place (to version and deploy separately).

Steps to Reproduce the Problem

Using the actor sample in the repo - remove the project reference from the sample client. Copy the IDemoActor interface into the sample project, and change the namespace used to declare to be inconsistent with the hosting project.

rynowak avatar Oct 11 '20 21:10 rynowak

Non remoting scenario without the need for sharing the interface can be used for this: https://github.com/dapr/dotnet-sdk/blob/master/samples/Actor/ActorClient/Program.cs#L74

amanbha avatar Oct 12 '20 16:10 amanbha

I just ran into this error on a new project. Is a copy of existing project that works fine.

What do I need to start looking at to resolve this cryptic error?

MattCosturos avatar Oct 27 '23 16:10 MattCosturos

Hi @MattCosturos - It's a been a while since I opened this issue, so I'm remembering to the best of my ability ....

What I remember about this issue is that the C# strongly-typed actor programming model requires you to share interface definitions between the client and the server. It's not good enough for for the interfaces to have the same members and names, they need to actually be shared via project-references.

rynowak avatar Oct 29 '23 18:10 rynowak

Thanks for getting back to me.

I ended up having some mixed up reference in my new project docker builds. I was using Actor binary from project 1, but client binary from the new project 2, so in my case it was an actual mismatch interface.

It would be great if the error message could be improved to be something like "Actor with Interface definition Task<string> DoSomething(int param) not found"

MattCosturos avatar Oct 30 '23 15:10 MattCosturos

Somewhat related, I have a proposal/PR (#1158) that would eliminate the need for applications to share compiled definitions when using strongly-typed interfaces.

philliphoff avatar Nov 01 '23 15:11 philliphoff