У меня возникла проблема при попытке использовать серверную версию MessagePack RPC
. Я написал одну реализацию для клиента и одну для сервера на основе кода Python, предоставленного клиентом моей компании.MessagePack RPC C# - сторона сервера
Реализация сервера должна потребляться Python, но, насколько я вижу, это не будет проблемой.
реализация сервера: реализация
public class Program
{
static void Main(string[] args)
{
try
{
DefaultServiceTypeLocator def = new DefaultServiceTypeLocator();
ServiceTypeLocator ser = def;
def.AddService(new Methods().GetType());
var services = ser.FindServices();
var configuration = new RpcServerConfiguration();
IPAddress ipAddress = GetIp();
configuration.BindingEndPoint = new IPEndPoint(ipAddress, 8089);
Console.WriteLine(new IPEndPoint(ipAddress, 8089).ToString());
using (var server = new RpcServer(configuration))
{
server.Start();
Console.ReadKey();
}
}
catch (Exception ex)
{
Console.Write(ex);
Console.ReadKey();
}
}
[MessagePackRpcServiceContractAttribute]
public class Methods
{
[MessagePackRpcMethodAttribute]
public int hello0()
{
Console.WriteLine("hello0");
return 0;
}
}
Клиент:
public class Program
{
static void Main(string[] args)
{
try
{
var configuration = new RpcClientConfiguration();
IPAddress ipAddress = GetIp();
using (dynamic proxy = new DynamicRpcProxy(new IPEndPoint(ipAddress, 8089), configuration))
{
dynamic res = proxy.hello0();
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadKey();
}
}
private static IPAddress GetIp()
{
string myHost = System.Net.Dns.GetHostName();
IPAddress myIP = null;
for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i];
}
}
return myIP;
}
}
Мой клиент не может подключиться к серверу, он не может видеть методы там. Ошибка: «операция не существует».
У кого-нибудь есть ключ?
спасибо !!
Вам необходимо настроить ServiceTypeLocator с помощью 'DefaultServiceTypeLocator'. Добавьте класс, который вы хотите открыть, используя '.AddService()' – Caramiriel
Hi @Caramiriel, Спасибо за ваш комментарий! Я сделал то, что вы сказали (я думаю), и я также добавил атрибуты метода и класса, но все равно не мог этого сделать = ( –
@MarianePinheiro, пожалуйста, после внесения изменений в свой код, предоставьте обновление, чтобы мы могли понять, что именно был изменен – DAG