.net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移
来源:互联网 发布:淘宝买家v5是什么级别 编辑:程序博客网 时间:2024/05/21 22:24
在学习.net core的过程中,我们已经明确被告知,Remoting将不会被支持。官方的解释是,.net framework 类型包含了太多的Runtime的内容,是一个非常重量级的服务实现,已被确定为一项有问题的体系结构。说白了就是迁移的难度很大,.net core中直接不提供了。微软的建议是,如果是进程内或跨进程通讯,建议我们使用 Pipes或者内存映射文件(Memory Mapped Files)。如果是机器间的调用,建议我们采用网络通讯的方案,比如HTTP、WCF等。
好吧,既然微软官方不支持, 我们只能自己想办法搞定了。
OK,说迁移方案前,我们先看看.net Framework中,使用Remoting的代码:
通过Remoting封装后的服务调用方法,我们可以直接得到一个服务接口的实现,通过调用次接口的本地代理实现执行远程调用。
static void Main(string[] args)
{
IUserService service = InvokeSerice.Proxy<IUserService>();
string uName = service.GetCurrentUserName();Console.WriteLine($"当前用户名:{uName}");
Console.ReadLine();
}
IUserService接口的声明如下:
public interface IUserService
{
string GetCurrentUserName();
}
InvokeService方法的核心实现逻辑如下:
//远程调用服务提供类
public class InvokeService
{//获取一个服务的本地调用代理对象
public static T Proxy<T>()
{
var proxy = new InvokeProxy<T>();
return (T)proxy.GetTransparentProxy();
}
}
//服务本地代理对象实现类
public class InvokeProxy<T> : RealProxy
{
private Type type = null;
public InvokeProxy() : this(typeof(T))
{
type = typeof(T);
}protected InvokeProxy(Type classToProxy) : base(classToProxy)
{
}//接收本地调用请求,然后转发远程访问
public override IMessage Invoke(IMessage msg)
{
Console.WriteLine("Invoke 远程服务调用!");
ReturnMessage message = new System.Runtime.Remoting.Messaging.ReturnMessage("Test",null,0,null,(IMethodCallMessage)msg);return (IMessage)message;
}
}
通过.NET Portability Analyzer分析这个工程,我们会得到系统不支持的结果。
既然,.net core 已经不支持RealProxy,那么就只能另起炉灶了。通过翻阅.net core的代码,终于发现了一个程序集:System.Reflection.DispatchProxy。此程序中,有一个类型DispatchProxy。(灵感还是来自于WCF。WCF是.net 中重量级的API,微软不可能不支持,通过翻阅其中的实现逻辑,终于到了RealProxy的替代方案。)
好吧,通过DispatchProxy提供的功能,很容易可以替代RealProxyP,Remoting的问题终于比较完美的解决了。下面就贴一下替换后的服务实现代码吧。
public class InvokeSerice
{
public static T Proxy<T>()
{
return DispatchProxy.Create<T, InvokeProxy<T>>();
}
}public class InvokeProxy<T> : DispatchProxy
{
private Type type = null;
public InvokeProxy()
{
type = typeof(T);
}protected override object Invoke(MethodInfo targetMethod, object[] args)
{
Console.WriteLine("Invoke 远程服务调用!");return "Test";
}
}
- .net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移
- Remoting核心类库RealProxy迁移
- .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
- .net core 2.0学习笔记(四):迁移.net framework 工程到.net core
- .net core 2.0学习笔记(四):迁移.net framework 工程到.net core
- .Net AOP(二)远程代理Remoting/RealProxy
- .Net AOP(二)远程代理Remoting/RealProxy
- OpenCV学习笔记7 OpenCV核心模块与核心功能Core Module & Core Functionality(六)
- .Net Remoting学习笔记
- C#学习笔记:.NET Remoting
- Core Java 8 学习笔记(六) 类的继承
- Python核心编程学习笔记(六)
- OpenCV学习笔记2 OpenCV核心模块与核心功能Core Module & Core Functionality(一)
- OpenCV学习笔记3 OpenCV核心模块与核心功能Core Module & Core Functionality(二)
- OpenCV学习笔记4 OpenCV核心模块与核心功能Core Module & Core Functionality(三)
- OpenCV学习笔记5 OpenCV核心模块与核心功能Core Module & Core Functionality(四)
- OpenCV学习笔记6 OpenCV核心模块与核心功能Core Module & Core Functionality(五)
- Webcast.NET Remoting学习笔记(3)对象激活
- python 分割列表
- 线性代数
- UML设计中的箭头详解
- java当中的List<E> 接口
- 分类中常见的类别不平衡问题解决方法
- .net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移
- 维优尚品——全国首家C2M电子商务平台
- jQuery如何追加tr到table中任意位置--向Table中指定位置添加tr或td(jQuery)
- java的工厂模式
- 准备PAT之All Roads Lead to Rome Dijikstra算法变型
- 高效实现List反序功能的实现
- Iterator、AbstractCollection、AbstractList
- C#路径中获取文件全路径、目录、扩展名、文件名称
- Android开发显示之前获取view的宽高方法