是否可以像 .Net Remoting 那样从远程对象访问属性?

问题描述 投票:0回答:1

我正在使用 .Net Remoting 与服务器激活对象进行通信。现在是时候迁移到另一种通信技术了,因为远程处理已被弃用。 这是我课堂上的一个例子来解释我的问题:

    public class Class1 : MarshalByRefObject
    {
        public Class1()
        {
            MyProp = new Class2();

        }
        public Class2 MyProp { get; set; }
    }

    public class Class2 : MarshalByRefObject
    {
        public string GetText()
        {
            return File.ReadAllText(@"c:\file.txt", Encoding.UTF8);
        }
    }

在服务器上,我创建一个通道并编组该类:

var c1 = new Class1();
RemotingServices.Marshal(c1, "myUri.rem", typeof(Class1));

从客户端创建到服务器的连接后,我可以执行以下操作:

var proxy = (Class1)RemotingServices.Connect(typeof(Class1), "myUri.rem");
var result = proxy.MyProp.GetText();

使用.Net Remoting,我可以访问远程对象上的属性MyProp并调用函数GetText。 GetText 的结果被序列化回客户端。
问题是我如何使用 WCF、gRPC 或其他方式将属性 MyProp 作为透明代理(远程对象)访问?

我对 WCF 的测试是将 Class2 序列化回客户端,但这不是我想要的。

.net wcf grpc remoting
1个回答
0
投票

我不太明白你的意思,但是我看到过一个基于回调操作的WCF远程调用的例子。

它基于Nettcp绑定。回调方法写在客户端,这样服务端既可以做服务端,又可以做客户端。

服务器:

ICalculator.cs

 [ServiceContract(CallbackContract = typeof(ICallback))]
    public interface ICalculator
    {
        [OperationContract(IsOneWay = true)]
        void Multiple(double a, double b);
    }

ICallback.cs

 public interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void DisplayResult(double x, double y, double result);
    }

计算器.cs

public class CalculatorService : ICalculator
     {
         public void Multiple(double a, double b)
         {
             double result = a * b;
             ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
             callback.DisplayResult(a, b, result);
         }
     }

服务器启动:

static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.Opened += delegate
                {
                  Console.WriteLine("Start");
                };
                host.Open(); 
                Console.Read();
            }
        }

客户

回调WCFService.cs

  public class CallbackWCFService : ICalculatorCallback
    {
        public void DisplayResult(double a, double b, double result)
         {
             Console.WriteLine("{0} * {1} = {2}", a, b, result);
         }
}

客户端启动:

 internal class Program
    {
        static void Main(string[] args)
        {
            InstanceContext instanceContex = new InstanceContext(new CallbackWCFService());
                        CalculatorClient proxy = new CalculatorClient(instanceContex);
                        proxy.Multiple(2, 3);
            
             Console.Read();
        }
    }

如果不符合您的期望,请提供更多信息。我会继续帮你解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.