我正在使用 .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 序列化回客户端,但这不是我想要的。
我不太明白你的意思,但是我看到过一个基于回调操作的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();
}
}
如果不符合您的期望,请提供更多信息。我会继续帮你解决问题。