我可以使用啥 RPC 技术在 C# 中调用已编译的程序集(而不是我自己的类)?

Posted

技术标签:

【中文标题】我可以使用啥 RPC 技术在 C# 中调用已编译的程序集(而不是我自己的类)?【英文标题】:What RPC technology can I use to call a compiled assembly (rather than my own class) in C#?我可以使用什么 RPC 技术在 C# 中调用已编译的程序集(而不是我自己的类)? 【发布时间】:2014-10-08 13:38:58 【问题描述】:

我想通过 RPC 访问一个 .NET 编译的程序集(调用代码是 Python,但这并不真正相关)。

程序集代表正在运行的第三方应用程序(例如 Autodesk AutoCAD)的 API。它包含几个命名空间,其中包含包含 API 对象的静态类。我需要访问该对象层次结构中的所有类型的东西:属性、对象、方法,也许是最复杂的,使用 IDisposable 接口的事务(这实质上意味着状态,即对象存储,应该在 RPC 调用之间维护)。

与其继续开发我自己的解决方案(使用 ZeroMQ 消息传递和基于反射的调用调度),我想知道哪种 RPC 技术可以满足我的需求。

我研究了实现 JSON-RPC 和 SOAP 的流行库的基本示例。我看到这些库要求您从它们的基类继承您的可调用类并将属性放入类声明中,例如

[SoapMethod("RequestResponseMethod")]

为了让 RPC 工作。显然,在外部预编译程序集的情况下我不能这样做。

我想知道 JSONRPC 或 SOAP 是否确实是我描述的任务的错误选择,或者实际上有一种方法可以使 RPC 与我不知道的外部程序集一起工作。

非常感谢任何指导、cmets 或基本建议,因为我没有使用任何现有 RPC 技术的经验。

【问题讨论】:

将其作为 Windows 服务托管? 我不确定这将如何解决问题。愿意分享任何参考资料吗? 【参考方案1】:

如果您在谈论 JSON / SOAP,我猜您正在使用 HTTP,它是无状态的 => 您需要提供某种“状态变量”。这可以通过例如我的例子中的 cookie 或类似的东西:

要访问您的外部 API,请创建“包装服务”(使用 WCF 或“老式网络服务”):

public class MyApiAccess : IMyApiService

    private static Dictionary<int, MyAPI> apiInstances = new Dictionary<int, MyAPI>();

    public int StartSession()
    
        var api = new MyAPI();
        int id = api.Id; // or some other way to get an unique id
        apiInstances.Add(id, api);
        return id;
    
    public void EndSession(int sessionId)
    
        // ensure "sessionId" is valid
        var api = apiInstances[sessionId];
        api.Dispose();
        apiInstances.Remove(api);
    

    public MyType MyMethod(myParameter param)
    
        // ensure "sessionId" is valid
        var api = apiInstances[sessionId];
        return api.MyMethod(param);
    

这应该为您提供如何实施此类服务的起点。

【讨论】:

感谢您的回答!我现在正在使用网络套接字并研究使用 HTTP 的选项。在这一点上,运输并不重要。包装服务看起来像是我会尽量避免的事情,因为这意味着如果我正确阅读了您的示例,我需要将要调用的目标 API 中的每个属性和方法包装起来。 The wrapper service looks like something I would try to avoid because that would mean I need to wrap every property and method in the target API that I want to call, if I read your example right. 是的,你是对的,但是如果你使用外部 API,IMO 没有办法解决这个问题...... 嗯,我目前这样做的方式涉及反射。在接收代码中,我有一个我希望能够调用的静态类字典。然后,我通过解析传入 RPC 消息中的字符串来调用对外部 API 的调用。这样我就可以避免编写包装器。 是的,“工作”,但对于静态的东西,这对我来说更像是“黑客”,而不是高性能的解决方案。你也可以在这里通过实现一个通用的public object InvokeMethod(string methodName, object param) 方法来做到这一点...... switch to a well-developed library or stick to my own solution 您需要自己回答。更多的工作,但性能和可维护性或“快速而肮脏”?如果可能的话,我总是会选择前者...

以上是关于我可以使用啥 RPC 技术在 C# 中调用已编译的程序集(而不是我自己的类)?的主要内容,如果未能解决你的问题,请参考以下文章

需要用 C# 编写的 RPC 调用示例

使用 rabbitmq 进行的 8 小时 RPC 调用。这听起来很疯狂,但有啥问题吗?

C#里事件和委托有啥区别啊??

rpc服务器不可用是啥意思?

php rpc好用吗,有啥优缺点?php rpc框架哪个好?

在 Golang 中的同一台服务器上调用已注册的 RPC 方法