相比 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与iReport 1.3.3初学者指南》 JasperReports和iReport是开发报表应用的利器,它们主要用于生成动态、复杂的业务报表。JasperReports是一个开源的Java库,而iReport是它的可视化设计工具。本文...
标题中的"commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar"提到了Apache Commons FileUpload的1.3.3版本的库及其源码。Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分...
在1.3.3版本中,泛型的使用更加灵活,提高了代码的通用性。 3. **函数和方法**:Ceylon支持高阶函数和匿名函数,这使得代码能够以函数式风格编写,增强了表达力。同时,类和接口可以拥有静态和实例方法,提供了面向...
功能没有阉割的老版本
"1.3.3前端包"通常指的是一个特定版本的前端项目或库,这个版本号"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版本 官方原版下载 原滋原味
GO工具and编译器 1.3.3版本 官方原版下载 原滋原味
1.3.3版本中,布局组件的性能和稳定性得到了提升,支持动态添加和删除面板,以及响应式布局,适应不同设备的显示需求。 5. **表单(form)验证** EasyUI 的表单组件支持自动验证,开发者可以通过简单的配置实现对...
1.3.3版本作为稳定且广泛使用的版本,具有许多优化和改进,能够有效处理大型文件上传、多部分请求以及错误处理等问题。 1. **基础概念** - **Multipart Request**:在HTTP协议中,文件上传通常涉及MIME类型的多...
GO工具and编译器 1.3.3版本 官方原版下载 原滋原味 注意:最后一个分卷扣2分
在软件开发过程中,SVN起到了至关重要的作用,它使得开发者可以回滚到之前的代码版本,查看历史变更,以及进行分支和合并操作。 Versions 的功能包括但不限于: 1. **源代码管理**:通过SVN,Versions 提供了对...
IOS14越狱,Odyssey-1.3.3 最新版 免墙下载 稳定不重启
标题中的"asm-1.3.3.jar.zip"是一个压缩文件,它包含了ASM库的特定版本,即1.3.3。ASM是一个Java字节码操控和分析框架,主要用于动态生成类或者增强已有类的功能。ASM库被广泛用于Java字节码的生成,例如在编译器、...
Apache Struts2 Commons FileUpload反序列化远程代码执行漏洞安全公告 安全公告编号:CNTA-2018-... 目前,Apache公司已发布了新版本(Struts 2.5.12及以上版本,包括Commons FileUpload库的修补版本1.3.3)修复了该漏洞
EasyUI 1.3.3是一个重要的更新版本,相比于早期版本,它可能包含了新的功能、性能优化以及对旧有功能的改进。开发者在升级到这个版本时,应关注其更新日志,了解新特性以充分利用其优势。 3. API中文版的重要性 ...
2. **映射器(Mapper)接口**:在1.3.3版本中,MyBatis引入了Mapper接口,使得开发人员可以使用面向对象的方式来操作数据库,提高了代码的可读性和可维护性。通过使用注解或XML配置,可以将方法与SQL语句绑定,使得...
这个是安卓手机上的下载工具「下载王」APP的最新v.1.3.3版本,新增双11领红包优惠券功能,给好友发福利码,后台下载列表新增批量删掉等功能。
jQuery EasyUI 1.3.3 是一个基于 jQuery 的轻量级前端开发框架,它提供了丰富的用户界面组件,如对话框、表格、菜单、表单等,极大地简化了Web应用程序的开发工作。这个源码包包含了未混淆的代码,使得开发者能够...