Ich habe eine Server-Anwendung unter Linux ausgeführt. Diese Anwendung wurde mit den Dateien Protobuf c und Protobuf.rpc.c für die RPC-Kommunikation entwickelt.Kommunikation zwischen C# läuft unter Windows und C läuft unter Linux mit Protobuf
Ich habe eine Client-Anwendung, die auf Windows lief.Es wurde in C# mit protobuf-net.dll und ProtobufRemote.dll für RPC-Kommunikation entwickelt.Beide Anwendung mit der gleichen Proto-Datei mit gleichen Service-Methoden.
Ich kann einen Proxy von C# -Client-Anwendung mit dem folgenden Code erstellen.
using System.Configuration;
using System.Net.Sockets;
using ProtoBufRemote; // rpc reference
using StarCall; // proto file
#region Create client connection
Int32 port = Convert.ToInt32(ConfigurationManager.AppSettings["PORT"]);
TcpClient tcpClient = new TcpClient(ConfigurationManager.AppSettings["SERVERIP"].ToString(), port);
var controller = new RpcController();
var client = new RpcClient(controller);
var channel = new NetworkStreamRpcChannel(controller, tcpClient.GetStream());
channel.Start();
var service = client.GetProxy<Istarcall_services>();
if (service == null)
Console.WriteLine("error creating client..");
//now calls can be made, they will block until a result is received
Console.WriteLine("Client connected to Server....\n");
#endregion
Aber immer, wenn ich versuche, eine Service-Methode von C# Client-Anwendung aufzurufen, wie unten dargestellt, wird die Anwendung hängen und keine Antwort von Linux c-Server-Anwendung zu bekommen.
try
{
Room_Config room = new Room_Config();
room.Room_Dial_Num = 1;
Room_Config roomRet = service.read_room(room); // service method
}
catch (Exception)
{
throw;
}
Die Anwendung hängt im folgenden Code.
protected RpcMessage.Parameter EndAsyncCallHelper(string methodName, IAsyncResult asyncResult)
{
PendingCall pendingCall = (PendingCall)asyncResult;
pendingCall.AsyncWaitHandle.WaitOne(); // application hanging here
pendingCall.AsyncWaitHandle.Close();
if (pendingCall.IsFailed)
throw new InvalidRpcCallException(serviceName, methodName,
String.Format("Server failed to process call, returned error message: \"{0}\".",
pendingCall.ServerErrorMessage));
return pendingCall.Result;
}
Nach den oben genannten Szenarien habe ich folgende Abfragen.
Ob diese protobuf remote C# dll helfen kann, eine communicatgion aus dem Linux-c-Code zu erstellen. Wenn nicht, bitte hilf mir einen Kommunikationskanal mit dem Linux c Code zu erstellen.
Bitte geben Sie an, wenn eine alternative RPC-DLL für C# -Client-Anwendung mit Linux Protobuf c und Protobuf RPC-Datei zu kommunizieren.
Bitte sagen Sie mir, ob meine obige Vorgehensweise falsch ist und beheben Sie mit der geeigneten Lösung.
Bitte helfen Sie mir. Wenn nicht klar, bitte senden Sie an die unten genannte Mail.
Das klingt * primär * wie der RPC-Stack; IMO die erste Sache zu prüfen ist, ob ProtobufRemote.dll für dieses Szenario (d. H. Ob es mit Ihrem protobuf.rpc.c-Dienst kompatibel ist) entwickelt wurde. –