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

时间:2014-10-08 13:38:59

标签: c# .net soap rpc json-rpc

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

程序集代表正在运行的第三方应用程序的API(例如,Autodesk AutoCAD)。它包含几个名称空间,其中包含包含API对象的静态类。我需要访问该对象层次结构中的各种内容:属性,对象,方法以及可能最复杂的使用IDisposable接口的事务(这实际上意味着应该在RPC调用之间维护状态,即对象存储)。 p>

我不知道继续开发自己的解决方案(使用ZeroMQ消息传递和基于反射的呼叫调度),我不知道什么是RPC技术才能满足我的需求。

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

[SoapMethod("RequestResponseMethod")]

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

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

由于我没有使用任何现有RPC技术的经验,因此非常感谢任何指导,评论或基本建议。

1 个答案:

答案 0 :(得分: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);
    }
}

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