帖一些东西:
不打算改良:指针支持--------------
2003-9-29
--------------
Lostinet.Janc改为3.0.0.0
新特征。
看例子10 -不支持继承上的成员
--------------
2003-8-26
--------------
Lostinet.Janc改为2.0.0.0
并且不提倡发布到GAC中.--------------
2003-8-18
--------------
重要更新!!!
为了避免Http GET的上传大小的限制,把invoke改为Http POST
如果要更新为这个版本,那么httpHandlers的注册的verb最好要设为"GET,POST"或"*"修正字符串因为xml忽略空白而导致前后空白去掉的问题。
使用TypeConverter来进行对string到其他类型的转换.--------------
2003-8-14
--------------
对于有0x007F以上的字符的编码,
采用了JScript环境下比LostinetEncode快很多倍的数据编码方法(不过大小则。。)--------------
2003-8-11
--------------
更正了IDicionary的问题.
返回的日期.ticks
--------------
2003-8-10
--------------
支持
<method name="*" type="sometype"/>--------------
2003-8-7
--------------
更新IDictionary是ICollection而导致处理的错误
更新误用IsSubclassOf的问题。--------------
2003-8-4
--------------
Lostinet.Janc.JancHandlerFactory.GetScriptContent--------------
2003-7-25
--------------
把无聊的zh-chs扔了。
[assembly: AssemblyCulture("")]
把ScriptHandler中的gb2312扔了。数据传输中,如果没有发现char>127的字符,那么不进行LostinetEncode把TargetInvocationException里的异常提出来显示。--------------
2003-7-17
--------------
Janc使用TypeDescriptor来列举对象的属性,
针对类型化的IDictionary(默认属性的类型为非object)的项列举属性的上传。
任意IDictionary的项的下载请安装最新的JancStp.msi--------------
2003-7-16
--------------
Janc去掉了客户端对循环对象引用的检查
请安装最新的JancStp.msi
--------------
2003-6-10
--------------
添加了JancMerge.msm这样Janc打包到别的安装程序。
Janc的处理设置了no-cache,避免IE保留执行结果。--------------
2003-6-9
--------------
例子说明\高级\
基本原理.txt
同步异步调用.txt
异常处理.txt
Example4至6
不打算改良:指针支持--------------
2003-9-29
--------------
Lostinet.Janc改为3.0.0.0
新特征。
看例子10 -不支持继承上的成员
--------------
2003-8-26
--------------
Lostinet.Janc改为2.0.0.0
并且不提倡发布到GAC中.--------------
2003-8-18
--------------
重要更新!!!
为了避免Http GET的上传大小的限制,把invoke改为Http POST
如果要更新为这个版本,那么httpHandlers的注册的verb最好要设为"GET,POST"或"*"修正字符串因为xml忽略空白而导致前后空白去掉的问题。
使用TypeConverter来进行对string到其他类型的转换.--------------
2003-8-14
--------------
对于有0x007F以上的字符的编码,
采用了JScript环境下比LostinetEncode快很多倍的数据编码方法(不过大小则。。)--------------
2003-8-11
--------------
更正了IDicionary的问题.
返回的日期.ticks
--------------
2003-8-10
--------------
支持
<method name="*" type="sometype"/>--------------
2003-8-7
--------------
更新IDictionary是ICollection而导致处理的错误
更新误用IsSubclassOf的问题。--------------
2003-8-4
--------------
Lostinet.Janc.JancHandlerFactory.GetScriptContent--------------
2003-7-25
--------------
把无聊的zh-chs扔了。
[assembly: AssemblyCulture("")]
把ScriptHandler中的gb2312扔了。数据传输中,如果没有发现char>127的字符,那么不进行LostinetEncode把TargetInvocationException里的异常提出来显示。--------------
2003-7-17
--------------
Janc使用TypeDescriptor来列举对象的属性,
针对类型化的IDictionary(默认属性的类型为非object)的项列举属性的上传。
任意IDictionary的项的下载请安装最新的JancStp.msi--------------
2003-7-16
--------------
Janc去掉了客户端对循环对象引用的检查
请安装最新的JancStp.msi
--------------
2003-6-10
--------------
添加了JancMerge.msm这样Janc打包到别的安装程序。
Janc的处理设置了no-cache,避免IE保留执行结果。--------------
2003-6-9
--------------
例子说明\高级\
基本原理.txt
同步异步调用.txt
异常处理.txt
Example4至6
解决方案 »
- 关于datalist,鼠标移动到某个单元格之后,tooltip显示另一个没有显示字段的值
- asp.net两个dropdownlist 和一个textbox 根据选项textbox获取值
- 用javascript如何交换两个数的值
- gridview 索引 10 不是为负数,就是大于行数。异常请高手帮忙,在线等
- 请问一般网上商城在用户登陆以后将登陆的用户信息保存在那里?Cookie中吗?
- 关于.net带有验证码 采集的问题
- 安装程序
- ASP区没人回答,只有发到这里了:如何读取输入的网址:如www.xxx.com
- 请问SQL Server2000 sp2不能直接在windows 2003中安装怎么办?
- footer中绑定了控件,可是如何捕捉控件的事件?
- 新手上路,ASP。NET和JSP有什么区别?那个更好呀???
- 为什么在DataList模板中Label可以数据绑定,而TextBox却不能????
使用 Lostinet.Janc 可以把服务器的静态方法发布给客户端进行远程调用注册方法是把
Lostinet.Janc.JancHandlerFactory,Lostinet.Janc,Version=1.0.0.0,Culture=Neutral,PublicKeyToken=2f07615e38006e0d
注册到config文件中的system.web/httpHandlers
(例子可以参考chatweb/web.config)你还需要一个文件用来定义需要发布哪些方法
(例子可以参考chatweb/chat.janc.ashx)Janc 的原理是通过服务器定义 :
<janc><object name="obj1"><method name="method1" type="yourservertype" assembly=....
把服务器的类的静态方法通过:
<script src="xxxx.ext?type=script></script> (例子看chat.html的头几行。。)
然后把obj.method1发布到IE中去。
所以在chat.html中 ChatService.GetDateTime 是可以直接使用脚本调用的。。
例如在chat.html里加上::
<script>
alert(ChatService.GetDateTime());
</script>
这段脚本。这段脚本就会把调用服务器的 ChatWeb.ChatService.GetDateTime , 然后显示服务器的时间。
而这些操作,一般由浏览器来完成。
但是这种完成方法有它的不足地方。就是进行GET,POST的窗体必须要刷新。如果要完成一项不刷新某页而进行和服务器交互的过程,那应该怎么做呢?常规来说,有以下方法:1。使用JavaApplet作为中介和服务器交互。不过用户必须为这交互过程编写Java代码。
2。使用ActiveX控件做中介。但是ActiveX的权限太大,未一定能得到客户信任。
3。使用IFrame把某个窗体隐藏,然后用传统的方法进行GET和POST。不过请求数据的发送和状态都非常难控制
4。使用MSXML的XMLHTTP来进行数据的传输。这个只适应于Win98或安装了MSXML(IE6自带的Windows系统)
5。使用dotnet的Assembly来写客户端程序。不过这需要客户端安装dotnet组件。Lostinet.Janc(以下称为Janc)是一个实现和服务器交互的组件。
实际上,它没有提供新的方法来进行和服务器的交互。
它的编写目的就只有一个:为了方便:
要方便代码的编写,要方便程序的发布。。Lostinet.Janc采用第4种方法(使用Microsoft.XMLHTTP)和服务器交互。为了发挥Janc的作用,服务器端和客户端都要做点手脚。而且这些手脚很容易做。首先,在服务器需要注册 Lostinet.Janc.JancHandlerFactory ,影射到某种url的处理。例如*.janc.ashx(或者干脆在IIS上注册*.janc类型。)
然后,需要建立一个???.janc.ashx,里面写上预定义格式的xml。用来说明需要把服务器上的什么东西发布到客户端去。这样,服务器端的工作算是完成了。而客户端要做的,就是放上这么一个代码:<script src="???.janc.ashx?type=script"></script>------------------------
由上面说明Janc的发布的步骤上可以看到,Janc的发布的步骤是非常少的。而且非常简单。其关键就是把服务器上???.janc.ashx里描述的
<janc>
<object name="Exam">
<method name="Greeting" type="ChatWeb.Example1.Exam" assembly="ChatWeb"/>
</object>
</janc>
影射到
<script src="???.janc.ashx?type=script"></script>然后自动生成客户端的
Exam对象,和它的方法:
Exam.Greeting()--------------------------------------------
但是它是怎样实现的呢?
首先。web.config里定义的
<configuration>
<system.web>
<httpHandlers>
<add path="*.Janc.Ashx" verb="GET" type="Lostinet.Janc.JancHandlerFactory,Lostinet.Janc,Version=1.0.0.0,Culture=zh-CHS,PublicKeyToken=2f07615e38006e0d" />
</httpHandlers>
</system.web>
</configuration>
把所有的???.janc.ashx形式的url地址都交给Lostinet.Janc.JancHandlerFactory进行处理。
(关于IHttpHandler和IHttpHandlerFactory,可以参考:ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconhttphandlers.htm)这样,在客户端使用<script src="???.janc.ashx?type=script"></script>对脚本下载的时候,
其实脚本就是由JancHandlerFactory进行输出的。JancHandlerFactory做以下事情:
一:读???.janc.ashx里包含的xml,找出里面描述的类和方法。
二:分析请求类型。例如type=script时,就输出客户端脚本和生成客户端对象的脚本。
三:处理服务器调用。
客户端标记<script src="???.janc.ashx?type=script"></script>
把Janc的脚本输出到客户端去,并且生成客户端的对象。当调用到Exam.Greeting()时,实际上它的内部步骤非常多:
1:分析客户端的参数。把参数格式化成xml。
2:把分析好的数据,使用xmlhttp发送到服务器端。
3:服务器端接受到请求后,开始分析客户端传过来的参数。
4:把客户端传过来的参数,转换到服务器端方法声明说需要的数据类型
5:调用服务器方法。并且取得返回值。
6:格式话返回值到xml中,然后返回给客户端。
7:客户端分析XMLHTTP返回的xml,然后把服务器的返回值的xml描述,转换成客户端类型。
8:把客户端类型作为Exam.Greeting的返回值返回。整个调用过程,对于使用者,根本不需要自己调用xmlhttp,也不需要自己定义发送和接受的过程,和参数的分析过程。
这些都由Janc都自动完成了。(Janc的客户端完成的JScript脚本,可以看看xxx.janc.ashx?type=script的输出)客户端调用服务器方法时,只需要像 var str=Exam.Greeting(); 这么一句就搞定了。--------------------------------------
下面说说第1,4,6,7步中涉及的数据类型的“影射”这里说的“影射”,意思是最大限度的类型的转换。
例如客户端有这样的数组:
var arr=new Array();
arr[0]=11;
arr[1]=23;
arr[2]=35;
那么该arr如果发送到服务器端,那么它期待的服务器端类型应该是
数组:double[],int[],string[],object[]..和其他double能转换到的类型的数组。
IList:ArrayList,...例如服务器端有这样的结构:
Point p=new Point(33,44);
那么影射到客户端去,客户端就接收到一个Object,起内容和下面代码写出来的一样:
var p=new Object();
p.X=33;
p.Y=44;
p.IsEmpty=false;(详细的情况可以参考Janc类型影射规则.txt)
-----------------------------------------------------------
分析 xxx.janc.ashx?type=script 的内容。
下面就以http://www.lostinet.com/jancchat/chat.janc.ashx?type=script的输出为例:前面的lostinetjancobjectbuilder是一个函数。用来构造客户端对象和方法。
最后面那行:
var ChatService=lostinetjancobjectbuilder('http://www.lostinet.com/jancchat/chat.janc.ashx','ChatService',['InitRoom','GetDateTime','KeepOnline','Leave','ListOnline','ListMessage','SendMessage']);
就是分析chat.janc.ashx里的xml的结果。
它通过lostinetjancobjectbuilder生成一个对象ChatService
这个ChatService有以下特征:
它的请求的URL是http://www.lostinet.com/jancchat/chat.janc.ashx
它的名字是:ChatService
它有这些方法:['InitRoom','GetDateTime','KeepOnline','Leave','ListOnline','ListMessage','SendMessage']这样,在客户端,就可以直接调用
ChatService.InitRoom()
ChatService.GetDateTime()
。。
这些方法了。
而lostinetjancobjectbuilder就是生成这些方法调用的脚本。
它把方法名称数组['InitRoom','GetDateTime','KeepOnline','Leave','ListOnline','ListMessage','SendMessage']
里的每一个方法名称,例如'InitRoom',创建成一个JScript的函数。
然后以ChatService['InitRoom']=FunctionName的形式,变为ChatService本身的方法。其调用的一个起点在
function Method()
{
return InvokeSync(Method.arguments);
}
里面。
InvokeSync的代码时:
function InvokeSync(args)
{
return ParseResponse(SendXMLHTTP(args,false));
}
它把调用参数发送给服务器端,然后解析并返回服务器端的返回值。
SendXMLHTTP的代码如下:
function SendXMLHTTP(args,async)
{
var xd=CreateXMLDOM();
xd.loadXML("<janc><request/></janc>");
var xe=xd.documentElement.firstChild;
for(var i=0;i<args.length;i++)
{
var e=xd.createElement("arg");
SerializeToElement(e,args[i]);
xe.appendChild(e);
}
var str=LostinetEncode(xd.xml);
var xh=CreateXMLHTTP();
xh.open("GET",url+"?type=invoke&rand="+Math.random(),async);
xh.setRequestHeader("jancobject",objectname);
xh.setRequestHeader("jancmethod",methodname);
xh.setRequestHeader("janclexml",str);
xh.send();
return xh;
}
它通过SerializeToElement(e,args[i]);把每个参数格式化成xml,
然后执行
xh.open("GET",url+"?type=invoke&rand="+Math.random(),async);
xh.setRequestHeader("jancobject",objectname);
xh.setRequestHeader("jancmethod",methodname);
xh.setRequestHeader("janclexml",str);
xh.send();
把请求发送到服务器端去。
其他的脚本这里就不再继续分析下去了。。
--------------------------------------------------------------
你的大作我看了,但发现一个问题,就是发言后,时间总是不对,不知是什么原因,期待ing.
ding