.net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移
在学习.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迁移的更多相关文章
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
- .net core 2.0学习笔记(四):迁移.net framework 工程到.net core
在迁移.net core的过程中,第一步就是要把.net framework 工程的目标框架改为.net core2.0,但是官网却没有提供转换工具,需要我们自己动手完成了..net framewor ...
- 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建
作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...
- .net core 2.0学习笔记(一):开发运行环境搭建
期待已久的.net core 2.0终于发布了!大家等的花儿都谢了. 不过比预期提前了一个多月,这在微软历史上还真的不多见.按照历史经验看,2.0版本应该比较靠谱,我猜这也是社区非常火爆的原因吧.下面 ...
- .net core 2.0学习笔记(五):程序配置&ConfigurationManager
配置组件是.net framework中非常常用的功能.在创建.net framework 工程时,系统不仅会自动生成app.config文件,而且还提供了非常强大的访问类库.但是这些好东西,在.ne ...
- net core 2.0学习笔记(一):开发运行环境搭建 (转)
期待已久的.net core 2.0终于发布了!大家等的花儿都谢了. 不过比预期提前了一个多月,这在微软历史上还真的不多见.按照历史经验看,2.0版本应该比较靠谱,我猜这也是社区非常火爆的原因吧.下面 ...
- .net core 2.0学习笔记(二):Hello World & 进阶
官网已经有一个.net core的入手教程(https://www.microsoft.com/net/core#windowscmd),但这个教程完全没有顾及全宇宙第一IDE的感受.今天就跟大家体验 ...
- .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持.两个类库的差异性,通过人工很难识别全.好在微软的工程师们考虑到了我 ...
- .net core 2.0学习笔记(二):部署到Windows和Liunx系统
.Net Core最大的亮点就是跨平台了,下面介绍下在Windows下和Liunx下的部署. 首先发布项目文件,点击网站项目右键 发布: 从下图发布的文件图片可以看出,不像以前bin目录下有很多dll ...
随机推荐
- USB的前世今生
在人类的历史长河中,很少有一种技术或者传输标准能像USB那样跟我们的生活息息相关,甚至到了没有不行的地步.USB对于今天的人们来说,就好像是空气,是水,是我们每天必需但是又熟视无睹的东西,没有多少人知 ...
- 二叉树 - 建立与遍历使用Java
二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- 【JAVASCRIPT】React学习-JSX 语法
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 JSX 语法 1. 定义 JSX 是javascript + xml 的合集,我们可以将javascript 与 ht ...
- 【js】操作checkbox radio 的操作总结
摘要 总是忘记checkbox radio 的具体操作,总是坑自己,总结下记下来 html <input type="checkbox" value="1" ...
- 【CSS】div父容器根据子容器大小自适应
Div即父容器不根据内容自动调节高度,我们看下面的代码: <div id="main"> <div id="content"></ ...
- 【css】圆角 +文本阴影
1. css3 圆角 http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-border-radius.html 2. text shawdow ...
- EF 数据库迁移(Migration)
Update-Database -ConnectionStringName "MyConnectionString"
- 大数据算法->推荐系统常用算法之基于内容的推荐系统算法
港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...
- ORACLE - 管理重做日志文件
ORACLE重做日志文件用于在数据库崩溃等情况下用于恢复数据,默认情况下为三个文件redo01.log/redo02.log/redo03.log,文件组循环使用,在录入与更新操作比较多的应用中,日志 ...