帖一些东西:
不打算改良:指针支持--------------
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

解决方案 »

  1.   

    http://www.lostinet.com
    使用 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 , 然后显示服务器的时间。
      

  2.   

    在Web的编程中。很多操作都是HTTP的GET,和POST。
    而这些操作,一般由浏览器来完成。
    但是这种完成方法有它的不足地方。就是进行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();
    把请求发送到服务器端去。
    其他的脚本这里就不再继续分析下去了。。
    --------------------------------------------------------------
      

  3.   

    楼主:
        你的大作我看了,但发现一个问题,就是发言后,时间总是不对,不知是什么原因,期待ing.
        ding