透明代理和泛型接口之间一个莫名其妙的问题

在使用 .Net 4.0 运行时框架 RealProxy 类构造一个透明代理时,如果目标接口为泛型类型,或者继承一个泛型接口时,再通过 new Func 的方式调用泛型接口上的方法即会出现 System._Canon 类的问题。

很奇怪的一个问题,找了一个多小时了,已经追到 Com 函数调用了,仍然没找到原因,初步诊断为 .Net 框架的一个 Bug 。

代码如下:

using System;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;

namespace TestRealProxy
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var service = new MyRealProxy().GetTransparentProxy() as IInterface;

            // 正确的结果
            var right = service.GetById(4);

            // 错误的结果
            Func<int, MyClass> func = service.GetById;
            var error = func(3);
        }
    }

    public interface IInterface<T> where T : class
    {
        T GetById(int id);
    }

    public interface IInterface : IInterface<MyClass>
    {
    }

    public class MyClass
    {
        public int Id { get; set; }
    }

    public class MyRealProxy : RealProxy
    {
        public MyRealProxy()
            : base(typeof(IInterface))
        {
        }

        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage methodCall = (IMethodCallMessage)msg;

            IMethodReturnMessage methodReturn = null;
            object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];
            methodCall.Args.CopyTo(copiedArgs, 0);
            try
            {
                object returnValue = new MyClass { Id = (int)methodCall.Args[0] };
                methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);
            }
            catch (Exception ex)
            {
                methodReturn = new ReturnMessage(ex, methodCall);
            }

            return methodReturn;
        }
    }
}

谁能解决这个问题?

时间: 2024-10-05 06:54:26

透明代理和泛型接口之间一个莫名其妙的问题的相关文章

图解正向代理、反向代理、透明代理

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://z00w00.blog.51cto.com/515114/1031287 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理

图解正向代理、反向代理、透明代理(转)

转自:http://www.cnblogs.com/Anker/p/6056540.html 正向代理:代理服务器代替客户端想服务器发送请求 反向代理:客户直接访问反向代理服务器,反向代理服务器通过反向代理获取服务器内容,然后返回给客户端 透明代理:修改包,中转,透明 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代

正向代理,反向代理和透明代理的区别

一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(origin server)[服务器B]之间的服务器[代理服务器Z],为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端.客户端必须要进行一些特别的设置才能使用正向代理.如下图1.1 (图1.1) 从上面的概念

图解正向代理、反向代理以及透明代理

链接地址:http://z00w00.blog.51cto.com/515114/1031287 1.正向代理: 所谓的正向代理就是代理服务器Z代替客户端A去访问目标服务器B.正向代理的作用有:访问本机无法访问的服务器(如FQ服务).加速访问服务器B(缩短路径).Cache作用.客户端访问授权.隐藏访问者的行踪(肉鸡)等. 2.反向代理: 和正向代理相反,反向代理Z对于客户端A而言就像是原始服务器,并且客户端不需要做特殊设置.客户端向反向代理服务器发送普通请求,接着反向代理服务器将判断向何处转交

图解正向代理、反向代理、透明代理(反向代理可以实现负载均衡)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://z00w00.blog.51cto.com/515114/1031287 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理

分解正向代理、反向代理、透明代理

套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理解代理服务技术. 一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端

[转]图解正向代理、反向代理、透明代理

上面的答案都说的很好,我画了张图能更直观地解释为何反向代理叫“反向“代理&amp;amp;amp;amp;amp;amp;amp;lt;img src="https://pic1.zhimg.com/480c1c45d2565e2f92fd930d25b73a18_b.jpg" data-rawwidth="522" data-rawheight="660" class="origin_image zh-lightbox-thu

nginx正向代理,反向代理,透明代理(总结)

1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容 代理服务器去取回来,然后返回给我 从网站的角度,只在代理服务器来取内容的时候有一次记录 有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站 结论就是 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务

.net 真实代理和透明代理的交互

1 1.本地代理调用 2 3 4 using System; 5 using System.Runtime.Remoting ; 6 using System.Runtime.Remoting.Services ; 7 using System.Runtime.Remoting.Activation ; 8 using System.Runtime.Remoting.Proxies ; 9 using System.Runtime.Remoting.Messaging ; 10 11 12 /*