`

HessianCSharp 1.3.3版本前使用泛型以及接口interface继承问题解决方案!!(实例代码)

 
阅读更多

相比 WebService Hessian 更简单、快捷。采用的是二进制 RPC 协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。下面演示一个简单的 Hessian 示例程序。


知道Hessian 已经远超期待!

 Java、Flash、Python、C++、.NET C#、D、Erlang、PHP、Ruby,看看伟大的Hessian 当前所支持的语言吧!


HessianCSharp 1.3.3版本前使用泛型以及接口interface继承问题解决方案!!(实例代码) 其他废话不说啦...

--------------------------------------------------------------------------------------------------------------------------------------

web.config

 

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authentication mode="Windows"/>
        <webServices>
            <protocols>
                <remove name="HttpPost"/>
                <remove name="HttpGet"/>
            </protocols>
        </webServices>
        <httpHandlers>
      <add verb="*" path="FilterService.hessian" type="App.Services.FilterService, Filter"/>
      <add verb="*" path="HttpService.hessian" type="App.Services.HttpService, Filter"/>
      <add verb="*" path="QueueService.hessian" type="App.Services.QueueService, Filter"/>
        </httpHandlers>
        <compilation debug="true">
        </compilation>
    </system.web>
    <startup><supportedRuntime version="v2.0.50727"/></startup>
    <system.codedom>
    </system.codedom>
    <system.webServer>
    </system.webServer>
</configuration>

-----------------------------------------------------------------------------

QueueService

 

public class QueueService : ServiceBase, IQueueService
    {
        string baseDataPath = @"d://queue//";
        public string Dequeue()
        {
            return GroupID;
        }
        public void Enqueue(string item)
        {

        }
        public void Load()
        {

        }

        public void Save()
        {

        }
       public  List<string> vv()
        {
            return new List<string>();
        }

-------------------------------------------------------------------------------------------------------------------------

public class ServiceBase : CHessianHandler
    {
        string id = "default";
        string groupId = "default";
       public string ID
        {
            set { id = value; }
            get { return id; }
        }
       public string GroupID
        {
            set { groupId = value; }
            get { return groupId; }
        }
    }

-------------------------------------------------------------------------------------------------------------------------------

 public interface IQueueService : IQueueService<string>
    {
       
    }
   public interface IQueueService<T>
   {
       string ID { set; get; }
       string GroupID { set; get; }
       string Dequeue();
       void Enqueue(T value);
       void Load();
       void Save();
       List<string> vv();
   }

------------------------------------------------------------------------------------------------------------------------

调试

 

 class Program
    {
        static void Main(string[] args)
        {
            CHessianProxyFactory f = new CHessianProxyFactory();
            f.IsOverloadEnabled = true;//
            string url="http://localhost:3263/";
            IQueueService service = f.Create(typeof(IQueueService), url + "QueueService.hessian") as IQueueService;

            url = "http://blog.csdn.net/zfrong";
            string data = "";

            List<string> v;
           
             data= service.Dequeue();
            v = service.vv();//


        }

以上调试结果   data返回null;v返回null;无法调用.....

 

问题原因 : 接口继承的情况下, proxyType是接口的话, proxyType.GetMethods();找不到接口继承的接口方法...


IQueueService service = f.Create(typeof(IQueueService), url + "QueueService.hessian") as IQueueService;

改成  

IQueueService<string> service = f.Create(typeof(IQueueService<string>), url + "QueueService.hessian") as IQueueService<string>;

以上调试结果   data返回"default";v返回 new实例;调用成功!!!!!!!!

--------------------------------------------------------------------------------------------------------

 

下面 看如何 解决....解决方案如下...... 修改源代码 中 CHessianProxyStandardImpl类

hessiancsharp.client
/// <summary>
    /// Proxy that works with .NET - Remote proxy framework
    /// </summary>
    public class CHessianProxyStandardImpl

-------------------------

添加 以下3个新方法 add new method;

 

/// <summary>
        /// 曾繁荣 zfrong2000@hotmail.com blog:http://blog.csdn.net/zfrong
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        MethodInfo[] GetTypeMethods(Type t)
        {
            if (t.IsInterface)
            {
               System.Collections.Generic.List<MethodInfo> mColl=new System.Collections.Generic.List<MethodInfo>();
               GetInterfaceMethods(t,mColl);
               return mColl.ToArray();//
            }
            else
                return t.GetMethods();//
        }
        /// <summary>
        /// 曾繁荣 zfrong2000@hotmail.com blog:http://blog.csdn.net/zfrong
        /// </summary>
        /// <param name="type"></param>
        /// <param name="mColl"></param>
        void GetInterfaceMethods(Type type,System.Collections.Generic.List<MethodInfo> mColl)
        {
            if (type.IsInterface)
            {

               mColl.AddRange(t.GetMethods());//
                Type[] ts = type.GetInterfaces();
                foreach (Type t in ts)
                {
                    GetInterfaceMethods(t, mColl);//
                }
            }
        }

 /// <summary>
        ///  /// 曾繁荣 zfrong2000@hotmail.com blog:http://blog.csdn.net/zfrong
        /// </summary>
        /// <param name="methodMessage"></param>
        /// <returns></returns>
        MethodInfo GetMethodInfoFor(IMethodCallMessage methodMessage)
        {
            foreach (MethodInfo m in this.m_methods)
            {
                if (m.Name.Equals(methodMessage.MethodName))
                    return m;
            }
            return null;
        }

...以上3方法辅助接口找到所有继承的接口的接口方法c# interface

 

然后-------修改   源代码中   ........

public CHessianProxyStandardImpl(Type proxyType,CHessianProxyFactory hessianProxyFactory, Uri uri) : base(typeof(IHessianProxyStandard))
        {
            this.m_proxyType = proxyType;   
            this.m_methodCaller = new CHessianMethodCaller(hessianProxyFactory,uri);
            //this.m_methods = proxyType.GetMethods();
            this.m_methods =GetTypeMethods(proxyType) ;//zfrong

//问题原因 : 接口继承的情况下, proxyType是接口的话, proxyType.GetMethods();找不 到接口继承的接口方法...

        }

        public CHessianProxyStandardImpl(Type proxyType, CHessianProxyFactory hessianProxyFactory, Uri uri, string username, string password)
            : base(typeof(IHessianProxyStandard))
        {
            this.m_proxyType = proxyType;
            this.m_methodCaller = new CHessianMethodCaller(hessianProxyFactory, uri, username, password);
            //this.m_methods = proxyType.GetMethods();
            this.m_methods = GetTypeMethods(proxyType);//zfr
ong
        }

 

 private MethodInfo GetMethodInfoForMethodBase(IMethodCallMessage methodMessage)
        {
            if (IsMethodNameUnique(methodMessage.MethodName))
            {  
                if(this.m_proxyType.IsInterface)
                     return GetMethodInfoFor(methodMessage);

                return this.m_proxyType.GetMethod(methodMessage.MethodName);
            }
            else
            {
                if (this.m_proxyType.IsInterface)
                    return GetMethodInfoFor(methodMessage);

                return this.m_proxyType.GetMethod(methodMessage.MethodName, CHessianMethodCaller.GetArgTypes(methodMessage.Args));
            }
        }

 
分享到:
评论

相关推荐

    jasperreports-1.3.3与iReport1.3.3初级使用

    《JasperReports 1.3.3与iReport 1.3.3初学者指南》 JasperReports和iReport是开发报表应用的利器,它们主要用于生成动态、复杂的业务报表。JasperReports是一个开源的Java库,而iReport是它的可视化设计工具。本文...

    commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar

    标题中的"commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar"提到了Apache Commons FileUpload的1.3.3版本的库及其源码。Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分...

    ceylon-1.3.3.zip

    在1.3.3版本中,泛型的使用更加灵活,提高了代码的通用性。 3. **函数和方法**:Ceylon支持高阶函数和匿名函数,这使得代码能够以函数式风格编写,增强了表达力。同时,类和接口可以拥有静态和实例方法,提供了面向...

    RFID_Tools_1.3.3

    功能没有阉割的老版本

    1.3.3前端包用于版本升级,没有私服

    "1.3.3前端包"通常指的是一个特定版本的前端项目或库,这个版本号"1.3.3"表明它是经过多次迭代和改进后的产物。在描述中提到的“用于版本升级”,意味着当前项目或应用需要更新到这个特定版本,以获取新的功能、修复...

    xvidcore-1.3.3.源代码

    《深入解析xvidcore-1.3.3源代码》 xvidcore是业界广泛应用的视频编码库,专为高效编码MPEG-4 Part 2 ASP(Advanced Simple Profile)视频流而设计。这个源代码包——xvidcore-1.3.3.tar.gz,包含了xvid编码器的...

    GO工具and编译器 1.3.3版本1

    GO工具and编译器 1.3.3版本 官方原版下载 原滋原味

    GO工具and编译器 1.3.3版本2

    GO工具and编译器 1.3.3版本 官方原版下载 原滋原味

    jquery-easyui-1.3.3

    1.3.3版本中,布局组件的性能和稳定性得到了提升,支持动态添加和删除面板,以及响应式布局,适应不同设备的显示需求。 5. **表单(form)验证** EasyUI 的表单组件支持自动验证,开发者可以通过简单的配置实现对...

    commons-fileupload-1.3.3

    1.3.3版本作为稳定且广泛使用的版本,具有许多优化和改进,能够有效处理大型文件上传、多部分请求以及错误处理等问题。 1. **基础概念** - **Multipart Request**:在HTTP协议中,文件上传通常涉及MIME类型的多...

    GO工具and编译器 1.3.3版本3

    GO工具and编译器 1.3.3版本 官方原版下载 原滋原味 注意:最后一个分卷扣2分

    Versions 1.3.3

    在软件开发过程中,SVN起到了至关重要的作用,它使得开发者可以回滚到之前的代码版本,查看历史变更,以及进行分支和合并操作。 Versions 的功能包括但不限于: 1. **源代码管理**:通过SVN,Versions 提供了对...

    Odyssey-1.3.3免墙下载

    IOS14越狱,Odyssey-1.3.3 最新版 免墙下载 稳定不重启

    asm-1.3.3.jar.zip

    标题中的"asm-1.3.3.jar.zip"是一个压缩文件,它包含了ASM库的特定版本,即1.3.3。ASM是一个Java字节码操控和分析框架,主要用于动态生成类或者增强已有类的功能。ASM库被广泛用于Java字节码的生成,例如在编译器、...

    commons-fileupload-1.3.3.zip

    Apache Struts2 Commons FileUpload反序列化远程代码执行漏洞安全公告 安全公告编号:CNTA-2018-... 目前,Apache公司已发布了新版本(Struts 2.5.12及以上版本,包括Commons FileUpload库的修补版本1.3.3)修复了该漏洞

    最新easyUi1.3.3版官方API中文版

    EasyUI 1.3.3是一个重要的更新版本,相比于早期版本,它可能包含了新的功能、性能优化以及对旧有功能的改进。开发者在升级到这个版本时,应关注其更新日志,了解新特性以充分利用其优势。 3. API中文版的重要性 ...

    mybatis-1.3.3.zip 增强版本

    2. **映射器(Mapper)接口**:在1.3.3版本中,MyBatis引入了Mapper接口,使得开发人员可以使用面向对象的方式来操作数据库,提高了代码的可读性和可维护性。通过使用注解或XML配置,可以将方法与SQL语句绑定,使得...

    下载王APP 最新v1.3.3版本 包含短视频去水印、4K/1080P高清视频下载等功能

    这个是安卓手机上的下载工具「下载王」APP的最新v.1.3.3版本,新增双11领红包优惠券功能,给好友发福利码,后台下载列表新增批量删掉等功能。

    jQuery EasyUI 1.3.3 源码

    jQuery EasyUI 1.3.3 是一个基于 jQuery 的轻量级前端开发框架,它提供了丰富的用户界面组件,如对话框、表格、菜单、表单等,极大地简化了Web应用程序的开发工作。这个源码包包含了未混淆的代码,使得开发者能够...

Global site tag (gtag.js) - Google Analytics