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

utugiqy6  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(97)

我正在使用.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属性作为TransparentProxy(远程对象)?
我使用WCF的测试是将Class2序列化回客户端,但这不是我想要的。

zphenhs4

zphenhs41#

我不太明白您的意思,但我看到了一个基于回调操作的WCF远程调用的示例。
它基于Nettcpbinding。回调方法写在客户端上,这样服务器就可以既是服务器又是客户端。

服务器:

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);
    }


Calculator.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();
            }
        }

客户

CallbackWCFService.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();
        }
    }


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

相关问题