.NET Remoting аналог TCPChannel для.NET Core
Поскольку.NET Remoting была удалена из среды.NET Core, я попытался использовать NetTcpBinding из библиотеки WCF, но она не включена в.NET Core.
Есть ли какой-нибудь другой аналог TCPChannel, который я могу использовать?
2 ответа
Вместо этого я бы попытался использовать другую среду RPC- в идеале нейтральную к платформе, а не ту, которая тесно связана с.NET.
Есть много доступных вариантов. Просто с макушки моей головы:
- Вы можете реализовать веб-API с использованием ASP.NET Core, вероятно (но не обязательно) с полезной нагрузкой JSON.
- Вы могли бы использовать gRPC, возможно (но не обязательно), используя в качестве полезной нагрузки буфер протокола
- Вы могли бы использовать Thrift
Это всего лишь примеры - существует огромное количество RPC и RPC-подобных фреймворков. Ничто из этого не будет таким "прозрачным", как использование удаленного взаимодействия, но:
- Они сделают это намного понятнее, когда вы будете звонить по сети
- Они позволят вам легче развиваться между версиями сервиса
- Они позволят вам использовать смесь платформ для серверов и клиентов - которые вам могут не понадобиться прямо сейчас, но хороши для будущего
Если у вас большая база кода, основанная на .NET Remoting, переход на WebAPI или gRPC может привести к перезаписи половины вашего приложения.
CoreRemoting (с лицензией MIT) может быть альтернативой: https://github.com/theRainbird/CoreRemoting Это позволяет переносить клиент-серверные приложения на основе .NET Remoting в .NET Core / .NET 5. В отличие от gRPC или WebAPI , процедура CoreRemoting очень похожа на .NET Remoting. Между объектами .NET выполняются только вызовы удаленных методов. Преобразование вызовов в HTTP-вызовы (построение URL-адресов с конкатенацией строк), как в случае с WebAPI, не требуется. Интерфейсы между клиентом и сервером определены в общих сборках .NET, а не на специальном языке интерфейса, как в gRPC. События и обратные вызовы поддерживаются "из коробки" и могут использоваться естественным образом для разработчика C# (по сравнению с более сложным потоковым подходом gRPC).
В следующем примере показано, как с помощью CoreRemoting можно создать простое приложение чата клиент / сервер.
Сборка общего контракта
namespace HelloWorld.Shared
{
public interface ISayHelloService
{
event Action<string, string> MessageReceived;
void Say(string name, string message);
}
}
Сервер
using System;
using CoreRemoting;
using CoreRemoting.DependencyInjection;
using HelloWorld.Shared;
namespace HelloWorld.Server
{
public class SayHelloService : ISayHelloService
{
// Event to notify clients when users post new chat messages
public event Action<string, string> MessageReceived;
// Call via RPC to say something in the chat
public void Say(string name, string message)
{
MessageReceived?.Invoke(name, message);
}
}
public static class HelloWorldServer
{
static void Main(string[] args)
{
using var server = new RemotingServer(new ServerConfig()
{
HostName = "localhost",
NetworkPort = 9090,
RegisterServicesAction = container =>
{
// Make SayHelloSevice class available for RPC calls from clients
container.RegisterService<ISayHelloService, SayHelloService>(ServiceLifetime.Singleton);
}
});
server.Start();
Console.WriteLine("Server is running.");
Console.ReadLine();
}
}
}
Клиент
using System;
using CoreRemoting;
using HelloWorld.Shared;
namespace HelloWorld.Client
{
public static class HelloWorldClient
{
static void Main(string[] args)
{
using var client = new RemotingClient(new ClientConfig()
{
ServerHostName = "localhost",
ServerPort = 9090
});
client.Connect();
// Create a proxy of the remote service, which behaves almost like a regular local object
var proxy = client.CreateProxy<ISayHelloService>();
// Receive chat messages send by other remote users by event
proxy.MessageReceived += (senderName, message) =>
Console.WriteLine($"\n {senderName} says: {message}\n");
Console.WriteLine("What's your name?");
var name = Console.ReadLine();
Console.WriteLine("\nEntered chat. Type 'quit' to leave.");
bool quit = false;
while (!quit)
{
var text = Console.ReadLine();
if (text != null && text.Equals("quit", StringComparison.InvariantCultureIgnoreCase))
quit = true;
else
{
// Post a new chat message
proxy.Say(name, text);
}
}
}
}
}
CoreRemoting работает только с .NET на .NET. Если вам нужно общаться с Javascript, Java, Python, ..., то это неподходящий инструмент. Но если вы хотите выполнять RPC только в чистой среде .NET и хотите делать это удобным образом, CoreRemoting может оказаться очень полезным.
Хочу отметить, что я разработчик проекта CoreRemoting.