.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.

Другие вопросы по тегам