Microsoft .NET Remoting£º¼¼Êõ¸ÅÊö
Piet Obermeyer ºÍ Jonathan Hawkins
Microsoft Corporation
ÕªÒª£º±¾ÎÄÌṩÁË Microsoft .NET Remoting ¿ò¼ÜµÄ¼¼Êõ¸ÅÊö£¬ÆäÖаüÀ¨ÁËʹÓà TCP ͨµÀ»ò HTTP ͨµÀµÄʾÀý¡£
Ŀ¼
¼ò½é
Ô¶³Ì¶ÔÏó
´úÀí¶ÔÏó
ͨµÀ
¼¤»î
¶ÔÏóµÄ×âÓÃÉú´æÆÚ
×ܽá
¸½Â¼ A£ºÊ¹Óà TCP ͨµÀ½øÐÐÔ¶³Ì´¦ÀíµÄʾÀý
¸½Â¼ B£ºÊ¹Óà HTTP ͨµÀ½øÐÐÔ¶³Ì´¦ÀíµÄʾÀý
¼ò½é
Microsoft® .NET Remoting ÌṩÁËÒ»ÖÖÔÊÐí¶ÔÏóͨ¹ýÓ¦ÓóÌÐòÓòÓëÁíÒ»¶ÔÏó½øÐн»»¥µÄ¿ò¼Ü¡£ÕâÖÖ¿ò¼ÜÌṩÁ˶àÖÖ·þÎñ£¬°üÀ¨¼¤»îºÍÉú´æÆÚÖ§³Ö£¬ÒÔ¼°¸ºÔðÓëÔ¶³ÌÓ¦ÓóÌÐò½øÐÐÏûÏ¢´«ÊäµÄͨѶͨµÀ¡£¸ñʽ»¯³ÌÐòÓÃÓÚÔÚÏûϢͨ¹ýͨµÀ´«Êä֮ǰ£¬¶ÔÆä½øÐбàÂëºÍ½âÂë¡£Ó¦ÓóÌÐò¿ÉÒÔÔÚ×¢ÖØÐÔÄܵij¡ºÏʹÓöþ½øÖƱàÂ룬ÔÚÐèÒªÓëÆäËûÔ¶³Ì´¦Àí¿ò¼Ü½øÐн»»¥µÄ³¡ºÏʹÓà XML ±àÂë¡£ÔÚ´ÓÒ»¸öÓ¦ÓóÌÐòÓòÏòÁíÒ»¸öÓ¦ÓóÌÐòÓò´«ÊäÏûϢʱ£¬ËùÓÐµÄ XML ±àÂ붼ʹÓà SOAP ÐÒé¡£³öÓÚ°²È«ÐÔ·½ÃæµÄ¿¼ÂÇ£¬Ô¶³Ì´¦ÀíÌṩÁË´óÁ¿¹Ò¹³£¬Ê¹µÃÔÚÏûÏ¢Á÷ͨ¹ýͨµÀ½øÐд«Êä֮ǰ£¬°²È«½ÓÊÕÆ÷Äܹ»·ÃÎÊÏûÏ¢ºÍÐòÁл¯Á÷¡£
ͨ³££¬Èç¹ûûÓеײã¿ò¼ÜµÄÖ§³Ö£¬¹ÜÀíÔ¶³Ì¶ÔÏóµÄÉú´æÆÚ»á·Ç³£Âé·³¡£.NET Remoting ÌṩÁËÐí¶à¿É¹©Ñ¡ÔñµÄÉú´æÆÚÄ£ÐÍ£¬ÕâЩģÐÍ·ÖΪÁ½¸öÀà±ð£º
¿Í»§¶Ë¼¤»î¶ÔÏó
·þÎñÆ÷¼¤»î¶ÔÏó
¿Í»§¶Ë¼¤»î¶ÔÏóÊÜ»ùÓÚ×âÓõÄÉú´æÆÚ¹ÜÀíÆ÷µÄ¿ØÖÆ£¬ÕâÖÖ¹ÜÀíÆ÷È·±£ÁË×âÓÃÆÚÂúʱ¶ÔÏó¿É±»»ØÊÕ¡£¶ø¶ÔÓÚ·þÎñÆ÷¼¤»î¶ÔÏ󣬿ª·¢ÈËÔ±Ôò¿ÉÒÔÑ¡Ôñ¡°µ¥Ò»µ÷Óá±Ä£Ê½»ò¡°µ¥Ò»ÔªËØ¡±Ä£Ê½¡£
Ô¶³Ì¶ÔÏó
ÈκÎÔ¶³Ì´¦Àí¿ò¼ÜµÄÖ÷ҪĿµÄÖ®Ò»¾ÍÊÇÒªÌṩ±ØÒªµÄ»ù´¡½á¹¹£¬ÒÔ±ãÒþ²ØÔ¶³Ì¶ÔÏóµ÷Ó÷½·¨ºÍ·µ»Ø½á¹ûµÄ¸´ÔÓÐÔ¡£ÈκÎλÓÚµ÷Ó÷½Ó¦ÓóÌÐòÓòÖ®ÍâµÄ¶ÔÏ󣬼´Ê¹ÔÚͬһ̨¼ÆËã»úÉÏÖ´ÐУ¬Ò²»á±»ÈÏΪÊÇÔ¶³Ì¶ÔÏó¡£ÔÚÓ¦ÓóÌÐòÓòÄÚ²¿£¬ÔʼÊý¾ÝÀàÐͰ´ÊýÖµ´«µÝ£¬¶øËùÓеĶÔÏó°´ÒýÓô«µÝ¡£ÒòΪ±¾µØ¶ÔÏóÒýÓýöÔÚ´´½¨¶ÔÏóµÄÓ¦ÓóÌÐòÓòÄÚÓÐЧ£¬ËùÒÔËüÃDz»ÄÜÒÔÕâÖÖ·½Ê½´«µÝµ½Ô¶³Ì·½·¨µ÷Óûò´ÓÔ¶³Ì·½·¨µ÷Ó÷µ»Ø¡£ËùÓбØÐë¿çÔ½Ó¦ÓóÌÐòÓòµÄ±¾µØ¶ÔÏó¶¼±ØÐë°´ÊýÖµÀ´´«µÝ£¬²¢ÇÒÓ¦¸ÃÓà [serializable] ×Ô¶¨ÒåÊôÐÔ×÷±ê¼Ç£¬·ñÔòËüÃDZØÐëʵÏÖ ISerializable ½Ó¿Ú¡£¶ÔÏó×÷Ϊ²ÎÊý´«µÝʱ£¬¿ò¼Ü½«¸Ã¶ÔÏóÐòÁл¯²¢´«Ê䵽Ŀ±êÓ¦ÓóÌÐòÓò£¬¶ÔÏó½«ÔÚ¸ÃÄ¿±êÓ¦ÓóÌÐòÓòÖб»ÖØÐ¹¹Ôì¡£ÎÞ·¨ÐòÁл¯µÄ±¾µØ¶ÔÏ󽫲»ÄÜ´«µÝµ½ÆäËûÓ¦ÓóÌÐòÓòÖУ¬Òò¶øÒ²²»ÄÜÔ¶³Ì´¦Àí¡£
ͨ¹ý´Ó MarshalByRefObject µ¼³ö¶ÔÏó£¬Äú¿ÉÒÔʹÈÎÒ»¶ÔÏó±äΪԶ³Ì¶ÔÏó¡£µ±Ä³¸ö¿Í»§¶Ë¼¤»îÒ»¸öÔ¶³Ì¶ÔÏóʱ£¬Ëü½«½ÓÊÕµ½¸ÃÔ¶³Ì¶ÔÏóµÄ´úÀí¡£¶Ô¸Ã´úÀíµÄËùÓвÙ×÷¶¼±»Êʵ±µØÖØÐ¶¨Ïò£¬Ê¹Ô¶³Ì´¦Àí»ù´¡½á¹¹Äܹ»ÕýÈ·½ØÈ¡ºÍת·¢µ÷Ó᣾¡¹ÜÕâÖÖÖØÐ¶¨Ïò¶ÔÐÔÄÜÓÐһЩӰÏ죬µ« JIT ±àÒëÆ÷ºÍÖ´ÐÐÒýÇæ (EE) ÒѾÓÅ»¯£¬¿ÉÒÔÔÚ´úÀíºÍÔ¶³Ì¶ÔÏóפÁôÔÚͬһ¸öÓ¦ÓóÌÐòÓòÖÐʱ£¬·ÀÖ¹²»±ØÒªµÄÐÔÄÜËðʧ¡£Èç¹û´úÀíºÍÔ¶³Ì¶ÔÏó²»ÔÚͬһ¸öÓ¦ÓóÌÐòÓòÖУ¬Ôò¶ÑÕ»ÖеÄËùÓз½·¨µ÷ÓòÎÊý»á±»×ª»»ÎªÏûÏ¢²¢±»´«Êäµ½Ô¶³ÌÓ¦ÓóÌÐòÓò£¬ÕâЩÏûÏ¢½«ÔÚ¸ÃÔ¶³ÌÓ¦ÓóÌÐòÓòÖб»×ª»»ÎªÔÀ´µÄ¶ÑÕ»Ö¡£¬Í¬Ê±¸Ã·½·¨µ÷ÓÃÒ²»á±»µ÷Óᣴӷ½·¨µ÷ÓÃÖзµ»Ø½á¹ûʱҲʹÓÃͬһ¹ý³Ì¡£
´úÀí¶ÔÏó
´úÀí¶ÔÏóÊÇÔÚ¿Í»§¶Ë¼¤»îÔ¶³Ì¶ÔÏóʱ´´½¨µÄ¡£×÷ΪԶ³Ì¶ÔÏóµÄ´ú±í£¬´úÀí¶ÔÏóÈ·±£¶Ô´úÀí½øÐеÄËùÓе÷Óö¼Äܹ»×ª·¢µ½ÕýÈ·µÄÔ¶³Ì¶ÔÏóʵÀý¡£ÎªÁË׼ȷÀí½â´úÀí¶ÔÏóµÄ¹¤×÷·½Ê½£¬ÎÒÃÇÐèÒª¸üÉîÈëµØÑо¿ËüÃÇ¡£µ±Ä³¸ö¿Í»§¶Ë¼¤»îÒ»¸öÔ¶³Ì¶ÔÏóʱ£¬¿ò¼Ü½«´´½¨ TransparentProxy ÀàµÄÒ»¸ö±¾µØÊµÀý£¨¸ÃÀàÖаüº¬ËùÓÐÀàµÄÁбíÓëÔ¶³Ì¶ÔÏóµÄ½Ó¿Ú·½·¨£©¡£ÒòΪ TransparentProxy ÀàÔÚ´´½¨Ê±Óà CLR ×¢²á£¬ËùÒÔ´úÀíÉϵÄËùÓз½·¨µ÷Óö¼±»ÔËÐÐʱ½ØÈ¡¡£Õâʱϵͳ½«¼ì²éµ÷Óã¬ÒÔÈ·¶¨ÆäÊÇ·ñΪԶ³Ì¶ÔÏóµÄÓÐЧµ÷Óã¬ÒÔ¼°Ô¶³Ì¶ÔÏóµÄʵÀýÊÇ·ñÓë´úÀíλÓÚͬһӦÓóÌÐòÓòÖС£Èç¹û¶ÔÏóÔÚͬһ¸öÓ¦ÓóÌÐòÓòÖУ¬Ôò¼òµ¥·½·¨µ÷Óý«±»Â·Óɵ½Êµ¼Ê¶ÔÏó£»Èç¹û¶ÔÏóλÓÚ²»Í¬µÄÓ¦ÓóÌÐòÓòÖУ¬½«Í¨¹ýµ÷ÓöÑÕ»Öеĵ÷ÓòÎÊýµÄ Invoke ·½·¨½«Æä´ò°üµ½ IMessage ¶ÔÏó²¢×ª·¢µ½ RealProxy ÀàÖС£´ËÀࣨ»òÆäÄÚ²¿ÊµÏÖ£©¸ºÔðÏòÔ¶³Ì¶ÔÏóת·¢ÏûÏ¢¡£TransparentProxy ÀàºÍ RealProxy Àà¶¼ÊÇÔÚÔ¶³Ì¶ÔÏó±»¼¤»îºóÔÚºǫ́´´½¨µÄ£¬µ«Ö»ÓÐ TransparentProxy ·µ»Øµ½¿Í»§¶Ë¡£
Òª¸üºÃµØÀí½âÕâЩ´úÀí¶ÔÏó£¬ÎÒÃÇÐèÒª¼òÒª½éÉÜһϠObjRef¡£¼¤»îÒ»½ÚÖÐÓйØÓÚ ObjRef µÄÏêϸ˵Ã÷¡£ÒÔÏ·½°¸¼òҪ˵Ã÷ÁË ObjRef ÓëÕâÁ½¸ö´úÀíÀàµÄ¹ØÁª·½Ê½¡£µ«Çë×¢Ò⣬ÕâÖ»ÊǹØÓڸýø³ÌµÄÒ»¸ö¼«Æä¸ÅÀ¨µÄ˵Ã÷£»¸ù¾Ý¶ÔÏóÊǿͻ§¶Ë¼¤»î¶ÔÏó»¹ÊÇ·þÎñÆ÷¼¤»î¶ÔÏó£¬ÒÔ¼°ËüÃÇÊǵ¥Ò»ÔªËضÔÏó»¹Êǵ¥Ò»µ÷ÓöÔÏ󣬸ýø³Ì»áÓÐËù²»Í¬¡£
Ô¶³Ì¶ÔÏó×¢²áÔÚÔ¶³Ì¼ÆËã»úµÄÓ¦ÓóÌÐòÓòÖС£Ô¶³Ì¶ÔÏó±»·âËÍÒÔÉú³É ObjRef¡£ObjRef °üº¬ÁË´ÓÍøÂçÉϵÄÈÎÒâλÖö¨Î»ºÍ·ÃÎÊÔ¶³Ì¶ÔÏóËùÐèµÄËùÓÐÐÅÏ¢£¬°üÀ¨£ºÀàµÄÔöÇ¿Ãû³Æ¡¢ÀàµÄ²ã´Î½á¹¹£¨Æä¸¸Àࣩ¡¢ÀàʵÏÖµÄËùÓнӿڵÄÃû³Æ¡¢¶ÔÏó URI ºÍËùÓÐÒÑ×¢²áµÄ¿ÉÓÃͨµÀµÄÏêϸÐÅÏ¢¡£ÔÚ½ÓÊÕµ½¶Ôij¸öÔ¶³Ì¶ÔÏóµÄÇëÇóʱ£¬Ô¶³Ì´¦Àí¿ò¼ÜʹÓöÔÏó URI À´¼ìË÷Ϊ¸Ã¶ÔÏó´´½¨µÄ ObjRef ʵÀý¡£
¿Í»§¶Ëͨ¹ýµ÷Óà new »òij¸ö Activator º¯Êý£¨ÀýÈç CreateInstance£©À´¼¤»îÔ¶³Ì¶ÔÏó¡£¶ÔÓÚ·þÎñÆ÷¼¤»î¶ÔÏó£¬Ô¶³Ì¶ÔÏóµÄ TransparentProxy ½«ÔÚ¿Í»§¶ËÓ¦ÓóÌÐòÓòÖÐÉú³É²¢·µ»Øµ½¿Í»§¶Ë£¬Õâʱ²»Ö´ÐÐÈκÎÔ¶³Ìµ÷Óá£Ö»ÓÐÔÚ¿Í»§¶Ëµ÷ÓÃÔ¶³Ì¶ÔÏóµÄij¸ö·½·¨Ê±£¬¸ÃÔ¶³Ì¶ÔÏó²Å»á±»¼¤»î¡£´Ë·½°¸Ã÷ÏÔ²»ÊʺϿͻ§¶Ë¼¤»î¶ÔÏó£¬ÒòΪ¿Í»§¶ËÏ£Íû¿ò¼ÜÖ»Ôڵõ½ÇëÇóʱ²Å¼¤»î¶ÔÏó¡£µ±¿Í»§¶Ëµ÷ÓÃij¸ö¼¤»î·½·¨Ê±£¬¿Í»§¶ËÉϻᴴ½¨Ò»¸ö¼¤»î´úÀí£¬²¢ÇÒ½«Ê¹Óà URL ºÍ¶ÔÏó URI ×÷ΪÖÕ½áµãÔÚ·þÎñÆ÷µÄÔ¶³Ì¼¤»îÆ÷Éϳõʼ»¯Ò»¸öÔ¶³Ìµ÷Óá£Ô¶³Ì¼¤»îÆ÷¼¤»î¸Ã¶ÔÏó£¬È»ºó ObjRef Á÷Ïò¿Í»§¶Ë£¬²¢±»È¡Ïû·âËÍÒÔÉú³ÉÒ»¸ö·µ»Ø¸ø¿Í»§¶ËµÄ TransparentProxy¡£
È¡Ïû·âË͵Ĺý³ÌÖлá·ÖÎö ObjRef ÒÔÌáȡԶ³Ì¶ÔÏóµÄ·½·¨ÐÅÏ¢£¬Í¬Ê±»¹»á´´½¨ TransparentProxy ºÍ RealProxy ¶ÔÏó¡£ÔÚÓà CLR ×¢²á TransparentProxy ֮ǰ£¬·ÖÎöºóµÄ ObjRef ÄÚÈݻᱻÌí¼Óµ½ TransparentProxy µÄÄÚ²¿±íÖС£
TransparentProxy ÊÇÒ»ÖÖÎÞ·¨Ìæ´úºÍÀ©Õ¹µÄÄÚ²¿À࣬¶ø RealProxy ºÍ ObjRef ÀàÔòÊôÓÚ¹«¹²À࣬¿ÉÒÔÔÚ±ØÒªÊ±½øÐÐÀ©Õ¹ºÍ×Ô¶¨Òå¡£ÒòΪ RealProxy ÀàÄܹ»´¦ÀíÔ¶³Ì¶ÔÏóµÄËùÓк¯Êýµ÷Óã¬ËùÒÔËüÊÇÖ´ÐиºÔØÆ½ºâµÈ²Ù×÷µÄÀíÏë·½·¨¡£µ÷Óà Invoke ʱ£¬´Ó RealProxy µ¼³öµÄÀà¿ÉÒÔ»ñµÃÍøÂçÖзþÎñÆ÷µÄ¸ºÔØÐÅÏ¢£¬²¢½«¸Ãµ÷Ó÷Óɵ½Êʵ±µÄ·þÎñÆ÷¡£¼òµ¥µØÎªËùÐèµÄ ObjectURI ´ÓͨµÀÇëÇóÒ»¸ö MessageSink£¬²¢µ÷Óà SyncProcessMessage »ò AsyncProcessMessage ÒÔ½«¸Ãµ÷ÓÃת·¢ÖÁËùÐèµÄÔ¶³Ì¶ÔÏó¡£µ±µ÷Ó÷µ»ØÊ±£¬Í¨¹ýµ÷Óà RemotingServices ÀàµÄ PropagateMessageToProxy ½«·µ»Ø²ÎÊýÍÆ»Øµ½¶ÑÕ»ÖС£
ÏÂÃæµÄ´úÂëÆ¬¶ÏÏÔʾÁËÈçºÎʹÓõ¼³öµÄ RealProxy Àà¡£
MyRealProxy proxy = new MyRealProxy(typeof(Foo));
Foo obj = (Foo)proxy.GetTransparentProxy();
int result = obj.CallSomeMethod();
ÉÏÀýÖлñÈ¡µÄ TransparentProxy ¿ÉÒÔ±»×ª·¢µ½ÁíÒ»¸öÓ¦ÓóÌÐòÓòÖС£µ±µÚ¶þ¸ö¿Í»§¶ËÊÔͼµ÷ÓôúÀíÉϵÄij¸ö·½·¨Ê±£¬Ô¶³Ì´¦Àí¿ò¼Ü»á³¢ÊÔ´´½¨ MyRealProxy ÀàµÄʵÀý£¬²¢ÇÒÈç¹û³ÌÐò¼¯¿ÉÓã¬ËùÓеĵ÷Óö¼»á·ÓÉÖÁ´ËʵÀý¡£Èç¹û³ÌÐò¼¯²»¿ÉÓ㬵÷Óûá·ÓÉÖÁĬÈϵÄÔ¶³Ì RealProxy¡£
ͨ¹ýΪĬÈ쵀 ObjRef ÊôÐÔ TypeInfo¡¢EnvoyInfo ºÍ ChannelInfo Ìá¹©Ìæ´ú£¬¿ÉÒÔºÜÈÝÒ×µØ×Ô¶¨Òå ObjRef¡£ÏÂÁдúÂëÏÔʾÁËÈçºÎ½øÐÐ×Ô¶¨Ò壺
public class ObjRef {
public virtual IRemotingTypeInfo TypeInfo
{
get { return typeInfo;}
set { typeInfo = value;}
}
public virtual IEnvoyInfo EnvoyInfo
{
get { return envoyInfo;}
set { envoyInfo = value;}
}
public virtual IChannelInfo ChannelInfo
{
get { return channelInfo;}
set { channelInfo = value;}
}
}
ͨµÀ
ͨµÀÓÃÓÚÔÚÔ¶³Ì¶ÔÏóÖ®¼ä´«ÊäÏûÏ¢¡£µ±¿Í»§¶Ëµ÷ÓÃij¸öÔ¶³Ì¶ÔÏóÉϵķ½·¨Ê±£¬Óë¸Ãµ÷ÓÃÏà¹ØµÄ²ÎÊýÒÔ¼°ÆäËûÏêϸÐÅÏ¢»áͨ¹ýͨµÀ´«Êäµ½Ô¶³Ì¶ÔÏó¡£µ÷ÓõÄÈκνá¹û¶¼»áÒÔͬÑùµÄ·½Ê½·µ»Ø¸ø¿Í»§¶Ë¡£¿Í»§¶Ë¿ÉÒÔÑ¡Ôñ¡°·þÎñÆ÷¡±ÖÐ×¢²áµÄÈÎһͨµÀ£¬ÒÔʵÏÖÓëÔ¶³Ì¶ÔÏóÖ®¼äµÄͨѶ£¬Òò´Ë¿ª·¢ÈËÔ±¿ÉÒÔ×ÔÓÉÑ¡Ôñ×îÊʺÏÐèÒªµÄͨµÀ¡£µ±È»£¬Ò²¿ÉÒÔ×Ô¶¨ÒåÈκÎÏÖÓеÄͨµÀ»ò´´½¨Ê¹ÓÃÆäËûͨѶÐÒéµÄÐÂͨµÀ¡£Í¨µÀÑ¡Ôñ×ñÑÒÔϹæÔò£º
ÔÚÄܹ»µ÷ÓÃÔ¶³Ì¶ÔÏó֮ǰ£¬Ô¶³Ì´¦Àí¿ò¼Ü±ØÐëÖÁÉÙ×¢²áÒ»¸öͨµÀ¡£Í¨µÀ×¢²á±ØÐëÔÚ¶ÔÏó×¢²á֮ǰ½øÐС£
ͨµÀ°´Ó¦ÓóÌÐòÓò×¢²á¡£Ò»¸ö½ø³ÌÖпÉÒÔÓжà¸öÓ¦ÓóÌÐòÓò¡£µ±½ø³Ì½áÊøÊ±£¬¸Ã½ø³Ì×¢²áµÄËùÓÐͨµÀ½«±»×Ô¶¯Çå³ý¡£
¶à´Î×¢²áÕìÌýͬһ¶Ë¿ÚµÄͨµÀÊÇ·Ç·¨µÄ¡£¼´Ê¹Í¨µÀ°´Ó¦ÓóÌÐòÓò×¢²á£¬Í¬Ò»¼ÆËã»úÉϵIJ»Í¬Ó¦ÓóÌÐòÓòÒ²²»ÄÜ×¢²áÕìÌýͬһ¶Ë¿ÚµÄͨµÀ¡£
¿Í»§¶Ë¿ÉÒÔʹÓÃÈκÎÒÑ×¢²áµÄͨµÀÓëÔ¶³Ì¶ÔÏóͨѶ¡£µ±¿Í»§¶ËÊÔͼÁ¬½ÓÖÁij¸öÔ¶³Ì¶ÔÏóʱ£¬Ô¶³Ì´¦Àí¿ò¼Ü»áÈ·±£¸Ã¶ÔÏóÁ¬½ÓÖÁÕýÈ·µÄͨµÀ¡£¿Í»§¶Ë¸ºÔðÔÚ³¢ÊÔÓëÔ¶³Ì¶ÔÏóͨѶ֮ǰµ÷Óà ChannelService ÀàµÄ RegisterChannel¡£
ËùÓеÄͨµÀ¶¼ÓÉ IChannel µ¼³ö£¬²¢¸ù¾ÝͨµÀµÄÓÃ;ʵÏÖ IChannelReceiver »ò IchannelSender¡£´ó¶àÊýͨµÀ¼ÈʵÏÖÁ˽ÓÊÕÆ÷½Ó¿Ú£¬ÓÖʵÏÖÁË·¢ËÍÆ÷½Ó¿Ú£¬Ê¹ËüÃÇ¿ÉÒÔÔÚÁ½¸ö·½ÏòÉÏͨѶ¡£µ±¿Í»§¶Ëµ÷ÓôúÀíÉϵÄij¸ö·½·¨Ê±£¬Ô¶³Ì´¦Àí¿ò¼Ü»á½ØÈ¡¸Ãµ÷Óò¢½«ÆäתΪҪ·¢Ë͵½ RealProxy Àࣨ»òÒ»¸öʵÏÖ RealProxy ÀàµÄʵÀý£©µÄÏûÏ¢¡£RealProxy ½«ÏûϢת·¢µ½ÏûÏ¢½ÓÊÕÆ÷ÒÔ½øÐд¦Àí¡£ÏûÏ¢½ÓÊÕÆ÷¸ºÔðÓëÔ¶³Ì¶ÔÏó×¢²áµÄͨµÀÖ®¼ä½¨Á¢Á¬½Ó£¬²¢Í¨¹ýͨµÀ£¨ÔÚ²»Í¬µÄÓ¦ÓóÌÐòÓò£©½«ÏûÏ¢´Óµ÷¶ÈλÖô«Êäµ½Ô¶³Ì¶ÔÏó±¾Éí¡£¼¤»îÁËÒ»¸öÔ¶³Ì¶ÔÏóºó£¬¿Í»§¶Ë»áͨ¹ýµ÷ÓÃÑ¡¶¨Í¨µÀÉ쵀 CreateMessageSink À´Ñ¡ÔñͨµÀ£¬²¢´ÓÆäÉϼìË÷Äܹ»ÓëÔ¶³Ì¶ÔÏóͨѶµÄÏûÏ¢½ÓÊÕÆ÷¡£
Ô¶³Ì´¦Àí¿ò¼ÜµÄÒ»¸öÈÝÒ×»ìÏýµÄ·½ÃæÊÇÔ¶³Ì¶ÔÏóºÍͨµÀÖ®¼äµÄ¹ØÏµ¡£ÀýÈ磬Èç¹û SingleCall Ô¶³Ì¶ÔÏóÖ»ÔÚ±»µ÷ÓÃʱ²Å¼¤»î£¬ÄÇô¸Ã¶ÔÏóÈçºÎÕìÌýÒªÁ¬½ÓµÄ¿Í»§¶Ë£¿
²¿·Ö´ð°¸ÔÚÓÚÕâÑùÒ»¸öÊÂʵ£ºÔ¶³Ì¶ÔÏó²¢²»ÓµÓÐ×Ô¼ºµÄͨµÀ£¬¶øÊǹ²ÏíͨµÀ¡£×÷ΪԶ³Ì¶ÔÏóËÞÖ÷µÄ·þÎñÆ÷Ó¦ÓóÌÐò±ØÐë×¢²áҪͨ¹ýÔ¶³Ì´¦Àí¿ò¼Ü¹«¿ªµÄ¶ÔÏóÒÔ¼°ËùÐèµÄͨµÀ¡£×¢²áºóµÄͨµÀ»á×Ô¶¯¿ªÊ¼ÔÚÖ¸¶¨µÄ¶Ë¿ÚÕìÌý¿Í»§ÇëÇó¡£×¢²áÔ¶³Ì¶ÔÏóºó£¬»áΪ¸Ã¶ÔÏó´´½¨Ò»¸ö ObjRef ²¢½«Æä´æ´¢ÔÚ±íÖС£µ±Í¨µÀÉÏ´«À´Ò»¸öÇëÇóʱ£¬Ô¶³Ì´¦Àí¿ò¼Ü»á¼ì²é¸ÃÏûÏ¢ÒÔÈ·¶¨Ä¿±ê¶ÔÏó£¬Í¬Ê±¼ì²é¶ÔÏóÒýÓñíÒÔ¶¨Î»±íÖеÄÒýÓá£Èç¹ûÕÒµ½Á˶ÔÏóÒýÓ㬽«´Ó±íÖмìË÷¿ò¼ÜÄ¿±ê¶ÔÏó»òÔÚ±ØÒªÊ±½«Æä¼¤»î£¬È»ºó¿ò¼Ü½«µ÷ÓÃת·¢ÖÁ¸Ã¶ÔÏó¡£¶ÔÓÚͬ²½µ÷Óã¬ÔÚÏûÏ¢µ÷ÓÃÆÚ¼ä»áһֱά³ÖÀ´×Ô¿Í»§¶ËµÄÁ¬½Ó¡£ÒòΪÿ¸ö¿Í»§¶ËÁ¬½Ó¶¼ÔÚ×Ô¼ºµÄÏß³ÌÉÏ´¦Àí£¬ËùÒÔÒ»¸öͨµÀ¿ÉÒÔͬʱ·þÎñÓÚ¶à¸ö¿Í»§¶Ë¡£
Éú³ÉÉÌÎñÓ¦ÓÃʱ£¬°²È«ÐÔÊÇÒ»¸öÖØÒªÎÊÌâ¡£ÒªÂú×ãÉÌÎñÒªÇ󣬿ª·¢ÈËÔ±±ØÐëÄܸøÔ¶³Ì·½·¨µ÷ÓÃÌí¼ÓÖîÈçÊÚȨ»ò¼ÓÃܵȰ²È«ÌØÐÔ¡£ÎªÁËʵÏÖÕâһĿ±ê£¬¿ª·¢ÈËÔ±¿ÉÒÔ×Ô¶¨ÒåͨµÀ£¬Ê¹ÆäÄܹ»¶ÔÓëÔ¶³Ì¶ÔÏóÖ®¼äµÄʵ¼ÊÏûÏ¢´«Êä»úÖÆ½øÐпØÖÆ¡£ÔÚ´«Êäµ½Ô¶³ÌÓ¦ÓóÌÐò֮ǰ£¬ËùÓеÄÏûÏ¢¶¼±ØÐëÁ÷¹ý SecuritySink¡¢TransportSink ºÍ FormatterSink£¬ÇÒÕâЩÏûÏ¢´«µÝµ½Ô¶³ÌÓ¦ÓóÌÐòºó»áÒÔÏà·´´ÎÐòÁ÷¹ýͬÑùµÄ½ÓÊÕÆ÷¡£
HTTP ͨµÀ
HTTP ͨµÀʹÓà SOAP ÐÒéÓëÔ¶³Ì¶ÔÏó´«ÊäÏûÏ¢¡£ËùÓеÄÏûÏ¢Á÷¹ý SOAP ¸ñʽ»¯³ÌÐòʱ¶¼±»×ª»»Îª XML ¸ñʽÇÒ±»ÐòÁл¯£¬ËùÐèµÄ SOAP Í·Ò²»á±»Ìí¼Óµ½¸ÃÁ÷ÖС£ÄúÒ²¿ÉÒÔÖ¸¶¨Äܹ»Éú³É¶þ½øÖÆÊý¾ÝÁ÷µÄ¶þ½øÖƸñʽ»¯³ÌÐò¡£È»ºó£¬Êý¾ÝÁ÷»áʹÓà HTTP ÐÒé´«Ê䵽Ŀ±ê URI¡£
TCP ͨµÀ
TCP ͨµÀʹÓöþ½øÖƸñʽ»¯³ÌÐò½«ËùÓеÄÏûÏ¢ÐòÁл¯Îª¶þ½øÖÆÁ÷£¬²¢Ê¹Óà TCP ÐÒ齫Æä´«Ê䵽Ŀ±ê URI¡£
¼¤»î
Ô¶³Ì´¦Àí¿ò¼ÜÖ§³ÖÔ¶³Ì¶ÔÏóµÄ·þÎñÆ÷¼¤»îºÍ¿Í»§¶Ë¼¤»î¡£²»ÐèÒªÔ¶³Ì¶ÔÏóÔÚ·½·¨µ÷ÓÃÖ®¼äά»¤ÈκÎ״̬ʱ£¬Ò»°ãʹÓ÷þÎñÆ÷¼¤»î¡£·þÎñÆ÷¼¤»îÒ²ÊÊÓÃÓÚ¶à¸ö¿Í»§¶Ëµ÷Ó÷½·¨Î»ÓÚͬһ¶ÔÏóʵÀýÉÏ¡¢ÇÒ¶ÔÏóÔÚº¯Êýµ÷ÓÃÖ®¼äά³Ö״̬µÄÇé¿ö¡£ÁíÒ»·½Ã棬¿Í»§¶Ë¼¤»î¶ÔÏó´Ó¿Í»§¶ËʵÀý»¯£¬²¢ÇÒ¿Í»§¶Ëͨ¹ýʹÓûùÓÚ×âÓõÄרÓÃϵͳÀ´¹ÜÀíÔ¶³Ì¶ÔÏóµÄÉú´æÆÚ¡£
ÔÚ¿ÉÒÔ½ÓÊܿͻ§¶ËµÄ·ÃÎÊ֮ǰ£¬ËùÓеÄÔ¶³Ì¶ÔÏó¶¼±ØÐëÓÃÔ¶³Ì´¦Àí¿ò¼Ü×¢²á¡£¶ÔÏó×¢²áÒ»°ãÓÉËÞÖ÷Ó¦ÓóÌÐòÀ´Íê³É¡£ËÞÖ÷Ó¦ÓóÌÐò½«Æô¶¯£¬Ê¹Óà ChannelServices ×¢²áÒ»¸ö»ò¶à¸öͨµÀ£¬Ê¹Óà RemotingServices ×¢²áÒ»¸ö»ò¶à¸öÔ¶³Ì¶ÔÏó£¬È»ºóµÈ´ý±»ÖÕÖ¹¡£Çë×¢Ò⣬ÒÑ×¢²áµÄͨµÀºÍ¶ÔÏóÖ»ÓÐÔÚÓÃÀ´×¢²áËüÃǵĽø³Ì»î¶¯Ê±²Å¿ÉÒÔʹÓá£Èç¹ûÍ˳öÁ˸ýø³Ì£¬Ôò»á×Ô¶¯´ÓÔ¶³Ì´¦Àí·þÎñÖÐɾ³ýËü×¢²áµÄËùÓÐͨµÀºÍ¶ÔÏó¡£ÔÚ¿ò¼ÜÖÐ×¢²áÔ¶³Ì¶ÔÏóʱ£¬ÐèÒªÒÔÏÂËÄÏîÐÅÏ¢£º
°üº¬ÀàµÄ³ÌÐò¼¯Ãû³Æ¡£
Ô¶³Ì¶ÔÏóµÄÀàÐÍÃû³Æ¡£
¿Í»§¶Ë¶¨Î»¶ÔÏóʱ½«Ê¹ÓõĶÔÏó URI¡£
·þÎñÆ÷¼¤»îËùÐèµÄ¶ÔÏóģʽ¡£¸Ãģʽ¿ÉÒÔÊÇ SingleCall£¬Ò²¿ÉÒÔÊÇ Singleton¡£
Ô¶³Ì¶ÔÏó¿ÉÒÔͨ¹ýÏÂÁÐÁ½ÖÖ·½Ê½×¢²á£ºµ÷Óà RegisterWellKnownType£¬½«ÉÏÊöÐÅÏ¢×÷Ϊ²ÎÊý´«µÝ£»»ò½«ÉÏÊöÐÅÏ¢´æ´¢ÔÚÅäÖÃÎļþÖУ¬È»ºóµ÷Óà ConfigureRemoting ²¢½«¸ÃÅäÖÃÎļþµÄÃû³Æ×÷Ϊ²ÎÊý´«µÝ¡£ÒÔÉÏÁ½ÖÖ·½·¨Ö´ÐеŦÄÜÏàͬ£¬Òò´ËÄú¿ÉÒÔʹÓÃËüÃÇÖеÄÈÎÒâÒ»ÖÖÀ´×¢²áÔ¶³Ì¶ÔÏó¡£µ±È»£¬ºóÒ»ÖÖ·½·¨¸ü·½±ãЩ£¬ÒòΪÎÞÐèÖØÐ±àÒëËÞÖ÷Ó¦ÓóÌÐò¼´¿É¸Ä±äÅäÖÃÎļþµÄÄÚÈÝ¡£ÒÔÏ´úÂëÆ¬¶ÏÏÔʾÁËÈçºÎ½« HelloService Àà×¢²áΪ SingleCall Ô¶³Ì¶ÔÏó¡£
RemotingServices.RegisterWellKnownType(
"server",
"Samples.HelloServer",
"SayHello",
WellKnownObjectMode.SingleCall);
ÆäÖУ¬¡°server¡±ÊdzÌÐò¼¯µÄÃû³Æ£¬HelloServer ÊÇÀàµÄÃû³Æ£¬SayHello ÊǶÔÏó URI¡£
×¢²áÁËÔ¶³Ì¶ÔÏóºó£¬¿ò¼Ü½«Îª¸Ã¶ÔÏó´´½¨Ò»¸ö¶ÔÏóÒýÓã¬È»ºó´Ó³ÌÐò¼¯ÖÐÌáÈ¡Óë¸Ã¶ÔÏóÏà¹ØµÄ±ØÒªÔªÊý¾Ý¡£Ëæºó£¬ÕâÒ»ÐÅÏ¢½«Óë URI ºÍ³ÌÐò¼¯Ãû³ÆÒ»Æð´æ´¢ÔÚ¶ÔÏóÒýÓÃÖУ¨¸Ã¶ÔÏóÒýÓý«±»Ð´ÈëÒ»¸öÓÃÓÚ¸ú×ÙÒÑ×¢²áÔ¶³Ì¶ÔÏóµÄÔ¶³Ì´¦Àí¿ò¼Ü±íÖУ©¡£Çë×¢Ò⣬³ýÁËÔÚ¿Í»§¶ËÊÔͼµ÷ÓöÔÏóÉϵÄij¸ö·½·¨»ò´Ó¿Í»§¶Ë¼¤»î¶ÔÏóʱÒÔÍ⣬ע²á½ø³Ì²»»áʵÀý»¯Ô¶³Ì¶ÔÏó×ÔÉí¡£
ÏÖÔÚ£¬ÈκÎÖªµÀ¸Ã¶ÔÏó URI µÄ¿Í»§¶Ë¶¼¿ÉÒÔʹÓà ChannelServices ×¢²áͨµÀ£¬²¢µ÷Óà new¡¢GetObject »ò CreateInstance ¼¤»î¶ÔÏ󣬴Ӷø»ñµÃ¸Ã¶ÔÏóµÄÒ»¸ö´úÀí¡£ÒÔÏ´úÂëÆ¬¶ÏÏÔʾÁ˸òÙ×÷µÄʾÀý£º
ChannelServices.RegisterChannel(new TCPChannel);
HelloServer obj = (HelloServer)Activator.GetObject(
typeof(Samples.HelloServer), "tcp://localhost:8085/SayHello");
ÆäÖУ¬¡°tcp://localhost:8085/SayHello¡±±íʾÎÒÃÇÏ£ÍûÔÚ¶Ë¿Ú 8085 ÉÏʹÓà TCP ÐÒéÁ¬½Óµ½Î»ÓÚ SayHello ÖÕ½áµãµÄÔ¶³Ì¶ÔÏó¡£ÔÚ±àÒë¸Ã¿Í»§¶Ë´úÂëʱ£¬±àÒëÆ÷Ã÷ÏÔ»áÒªÇó¹ØÓÚ HelloServer ÀàµÄÀàÐÍÐÅÏ¢¡£¸ÃÐÅÏ¢¿ÉÒÔͨ¹ýÒÔÏ·½Ê½Ö®Ò»À´Ìṩ£º
Ìṩ¶Ô HelloService ÀàËùÔÚ³ÌÐò¼¯µÄÒýÓá£
½«Ô¶³Ì¶ÔÏó²ð·ÖΪʵÏֺͽӿÚÀ࣬²¢ÔÚ±àÒë¿Í»§¶ËʱÒýÓÃÕâЩ½Ó¿Ú¡£
ʹÓà SOAPSUDS ¹¤¾ßÖ±½Ó´ÓÖÕ½áµãÌáÈ¡ËùÐèµÄÔªÊý¾Ý¡£´Ë¹¤¾ß½«Á¬½ÓÖÁËùÌṩµÄÖÕ½áµã£¬ÌáȡԪÊý¾Ý£¬È»ºóÉú³É¿ÉÓÃÓÚ±àÒë¿Í»§¶ËµÄ³ÌÐò¼¯»òÔ´´úÂë¡£
GetObject »ò new ¿ÉÓÃÓÚ·þÎñÆ÷¼¤»î¶ÔÏó¡£Çë×¢Ò⣬ʹÓÃÕâÁ½¸öµ÷ÓÃʱ²»»áʵÀý»¯¶ÔÏó£¬Êµ¼ÊÉϲ»»áÉú³ÉÈκÎÍøÂçµ÷Ó᣿ò¼Ü´ÓÔªÊý¾Ý»ñµÃÁË´´½¨´úÀíËùÐèµÄ×ã¹»ÐÅÏ¢£¬µ«²¢Î´Á¬½Óµ½Ô¶³Ì¶ÔÏóÉÏ¡£Ö»ÓÐÔÚ¿Í»§¶Ëµ÷ÓôúÀíÉϵÄij¸ö·½·¨Ê±²Å»á½¨Á¢ÍøÂçÁ¬½Ó¡£µ±µ÷Óõִï·þÎñÆ÷ʱ£¬¿ò¼Ü½«´ÓÏûÏ¢ÖÐÌáÈ¡ URI£¬¼ì²éÔ¶³Ì´¦Àí¿ò¼Ü±íÒԱ㶨λÓë URI Æ¥ÅäµÄ¶ÔÏóÒýÓã¬È»ºóÔÚ±ØÒªÊ±½«¶ÔÏóʵÀý»¯£¬²¢½«·½·¨µ÷ÓÃת·¢ÖÁ¶ÔÏó¡£Èç¹û½«¶ÔÏó×¢²áΪ SingleCall£¬ÔòÍê³É·½·¨µ÷Óúó¸Ã¶ÔÏó»áÈ¡Ïû¡£Ã¿´Îµ÷ÓÃÒ»¸ö·½·¨Ê±£¬¶¼»á´´½¨Ò»¸öеÄʵÀý¡£GetObject ºÍ new Ö®¼äµÄΨһ²î±ðÔÚÓÚ£¬Ç°ÕßÔÊÐíÖ¸¶¨ URL ×÷Ϊ²ÎÊý£¬¶øºóÕß´ÓÅäÖÃÖлñµÃ URL¡£
CreateInstance »ò new ¿ÉÓÃÓÚ¿Í»§¶Ë¼¤»î¶ÔÏó¡£Á½Õß¶¼ÔÊÐíʹÓôø²ÎÊýµÄ¹¹Ô캯ÊýÀ´ÊµÀý»¯¶ÔÏ󡣿ͻ§¶Ë¼¤»î¶ÔÏóµÄÉú´æÆÚÓÉÔ¶³Ì´¦Àí¿ò¼ÜÌṩµÄ×âÓ÷þÎñ¿ØÖÆ¡£¶ÔÏó×âÓõÄÄÚÈÝÔÚÏÂÒ»½ÚÖÐ˵Ã÷¡£
¶ÔÏóµÄ×âÓÃÉú´æÆÚ
ÿ¸öÓ¦ÓóÌÐòÓò¶¼°üº¬Ò»¸öÓÃÓÚ¹ÜÀíÆä×âÓÃÇé¿öµÄ×âÓùÜÀíÆ÷¡£ËùÓеÄ×âÓö¼»á±»¶¨ÆÚ¼ì²é£¬ÒÔÈ·¶¨×âÓÃÊÇ·ñÒѹýÆÚ¡£Èç¹û×âÓùýÆÚ£¬Ôò»áµ÷ÓøÃ×âÓõÄÒ»¸ö»ò¶à¸ö·¢ÆðÕߣ¬Ê¹ËüÃÇÓлú»á¸üÐÂ×âÓá£Èç¹ûËùÓеķ¢ÆðÕß¶¼²»×¼±¸¸üÐÂ×âÓã¬Ôò×âÓùÜÀíÆ÷»áɾ³ý¸Ã×âÓò¢½«¸Ã¶ÔÏó×÷ΪÀ¬»ø»ØÊÕ¡£×âÓùÜÀíÆ÷°´ÕÕÊ£Óà×âÓÃʱ¼äµÄ˳Ðòά»¤×âÓÃÁÐ±í¡£Ê£Óàʱ¼ä×î¶ÌµÄ×âÓÃÅÅÔÚÁбíµÄ¶¥¶Ë¡£
×âÓÿÉÒÔʵÏÖ ILease ½Ó¿Ú²¢´æ´¢Ò»¸öÊôÐÔ¼¯ºÏ£¬ÓÃÓÚÈ·¶¨¸üеIJßÂԺͷ½·¨¡£ÄúÒ²¿ÉÒÔʹÓõ÷ÓÃÀ´¸üÐÂ×âÓá£Ã¿´Îµ÷ÓÃÔ¶³Ì¶ÔÏóÉϵķ½·¨Ê±£¬×âÓÃʱ¼ä¶¼»áÉèÖÃΪĿǰ LeaseTime ×î´óÖµ¼ÓÉÏ RenewOnCallTime¡£LeaseTime ¼´½«¹ýÆÚʱ£¬·¢ÆðÕ߻ᱻҪÇó¸üÐÂ×âÓá£ÒòΪÎÒÃÇÓÐʱ»áÓöÉÏÍøÂç²»Îȶ¨£¬ËùÒÔ¿ÉÄÜ»áÕÒ²»µ½×âÓ÷¢ÆðÕß¡£ÎªÁËÈ·±£²»ÔÚ·þÎñÆ÷ÉÏÁôÏÂÎÞЧ¶ÔÏó£¬Ã¿¸ö×âÓö¼´øÓÐÒ»¸ö SponsorshipTimeout¡£¸ÃÖµÖ¸¶¨ÁË×âÓÃÖÕֹ֮ǰµÈ´ý×âÓ÷¢ÆðÕ߻ظ´µÄʱ¼ä³¤¶È¡£Èç¹û SponsershipTimeout ΪÁ㣬CurrentLeaseTime »á±»ÓÃÓÚÈ·¶¨×âÓõĹýÆÚʱ¼ä¡£Èç¹û CurrentLeaseTime µÄֵΪÁ㣬Ôò×âÓò»»á¹ýÆÚ¡£ÅäÖûò API ¿ÉÓÃÓÚÌæ´ú InitialLeaseTime¡¢SponsorshipTimeout ºÍ RenewOnCallTime µÄĬÈÏÖµ¡£
×âÓùÜÀíÆ÷ά»¤×ÅÒ»¸ö°´·¢Æðʱ¼ä´Ó´óµ½Ð¡´æ´¢µÄ·¢ÆðÕßÁÐ±í£¨ËüÃÇʵÏÖ ISponsor ½Ó¿Ú£©¡£ÐèÒªµ÷Ó÷¢ÆðÕßÒÔ¸üÐÂ×âÓÃʱ¼äʱ£¬×âÓùÜÀíÆ÷»á´ÓÁбíµÄ¶¥²¿¿ªÊ¼ÏòÒ»¸ö»ò¶à¸ö·¢ÆðÕßÒªÇó¸üÐÂ×âÓÃʱ¼ä¡£ÁÐ±í¶¥²¿µÄ·¢ÆðÕß±íʾÆäÒÔǰÇëÇóµÄ×âÓøüÐÂʱ¼ä×¡£Èç¹û·¢ÆðÕßûÓÐÔÚ SponsorshipTimeOut ʱ¼ä¶ÎÄÚÏìÓ¦£¬ÔòËü»á±»´ÓÁбíÖÐɾ³ý¡£Í¨¹ýµ÷Óà GetLifetimeService ²¢½«¶ÔÏó×âÓÃ×÷Ϊ²ÎÊý£¬¼´¿ÉÒÔ»ñµÃ¸Ã¶ÔÏó×âÓ᣸õ÷ÓÃÊÇ RemotingServices ÀàµÄÒ»¸ö¾²Ì¬·½·¨¡£Èç¹û¶ÔÏóÔÚÓ¦ÓóÌÐòÓòÄÚ²¿£¬Ôò¸Ãµ÷ÓõIJÎÊýÊǶÔÏóµÄ±¾µØÒýÓã¬ÇÒ·µ»ØµÄ×âÓÃÒ²ÊǸÃ×âÓõı¾µØÒýÓá£Èç¹û¶ÔÏóÊÇÔ¶³ÌµÄ£¬Ôò´úÀí»á×÷Ϊһ¸ö²ÎÊý´«µÝ£¬ÇÒ·µ»Ø¸øµ÷Ó÷½µÄÊÇ×âÓõÄ͸Ã÷´úÀí¡£
¶ÔÏóÄܹ»Ìṩ×Ô¼ºµÄ×âÓò¢¿ØÖÆ×Ô¼ºµÄÉú´æÆÚ¡£ËüÃÇͨ¹ýÌæ´ú MarshalByRefObject É쵀 InitializeLifetimeService ·½·¨À´Íê³É¸Ã²Ù×÷£¬ÈçÏÂËùʾ£º
public class Foo : MarshalByRefObject {
public override Object InitializeLifetimeService()
{
ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial) {
lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
}
return lease;
}
}
Ö»Óе±×âÓô¦ÓÚ³õʼ״̬ʱ£¬²Å¿ÉÒÔ¸ü¸Ä×âÓÃÊôÐÔ¡£InitializeLifetimeService µÄʵÏÖͨ³£µ÷ÓûùÀàµÄÏàÓ¦·½·¨£¬À´¼ìË÷Ô¶³Ì¶ÔÏóµÄÏÖÓÐ×âÓá£Èç¹ûÔÚ´Ë֮ǰ´Óδ¶Ô¸Ã¶ÔÏó·âË͹ý£¬Ôò·µ»ØµÄ×âÓûᴦÓÚÆä³õʼ״̬ÇÒ¿ÉÒÔÉèÖÃ×âÓÃÊôÐÔ¡£Ò»µ©·âËÍÁ˶ÔÏó£¬Ôò×âÓûá´Ó³õʼ״̬±äΪ¼¤»î״̬£¬²¢ºöÂÔÈκγõʼ»¯×âÓÃÊôÐԵij¢ÊÔ£¨µ«ÓÐÒ»ÖÖÇé¿öÀýÍ⣩¡£¼¤»îÔ¶³Ì¶ÔÏóʱ½«µ÷Óà InitializeLifetimeService¡£Í¨¹ý¼¤»îµ÷ÓÿÉÒÔÌṩһ¸ö×âÓ÷¢ÆðÕßµÄÁÐ±í£¬¶øÇÒµ±×âÓô¦ÓÚ¼¤»î״̬ʱ£¬¿ÉÒÔËæÊ±½«ÆäËû·¢ÆðÕßÌí¼Óµ½ÁбíÖС£
¿ÉÒÔÏÂÁз½Ê½ÑÓ³¤×âÓÃʱ¼ä£º
¿Í»§¶Ë¿ÉÒÔµ÷Óà Lease ÀàÉ쵀 Renew ·½·¨¡£
×âÓÿÉÒÔÏòij¸ö·¢ÆðÕßÇëÇó Renewal¡£
µ±¿Í»§¶Ëµ÷ÓöÔÏóÉϵÄij¸ö·½·¨Ê±£¬RenewOnCall Öµ»á×Ô¶¯¸üÐÂ×âÓá£
Ò»µ©×âÓùýÆÚ£¬ÆäÄÚ²¿×´Ì¬»áÓÉ Active ±äΪ Expired£¬ÇÒ²»ÔÙ¶Ô·¢ÆðÕß½øÐÐÈκε÷Ó㬶ÔÏóÒ²»á±»×÷ΪÀ¬»ø»ØÊÕ¡£Ò»°ãÇé¿öÏ£¬Èç¹û·¢ÆðÕß·ÖÉ¢ÔÚ Web ÉÏ»òλÓÚij¸ö·À»ðǽµÄºóÃæ£¬Ô¶³Ì¶ÔÏó»Ø½Ð·¢ÆðÕßʱ»áÓöµ½À§ÄÑ¡£Òò´Ë£¬·¢ÆðÕß²»±ØÓë¿Í»§¶Ë´¦ÓÚͬһλÖã¬Ö»ÒªÔ¶³Ì¶ÔÏóÄܹ»·ÃÎʵõ½£¬Ëü¿ÉÒÔÎªÍøÂçÉϵÄÈÎÒâλÖá£
ͨ¹ý×âÓÃÀ´¹ÜÀíÔ¶³Ì¶ÔÏóµÄÉú´æÆÚ¿ÉÒÔ×÷ΪÒýÓüÆÊýµÄÒ»ÖÖÌæ´ú·½·¨£¬ÒòΪµ±ÍøÂçÁ¬½ÓµÄÐÔÄܲ»¿É¿¿Ê±£¬ÒýÓüÆÊý»áÏԵø´ÔӺ͵ÍЧ¡£¾¡¹ÜÓÐÈË»á¼á³ÖÈÏΪԶ³Ì¶ÔÏóµÄÉú´æÆÚ±ÈËùÐèµÄʱ¼äÒª³¤£¬µ«ÓëÒýÓüÆÊýºÍÁ¬½Ó¿Í»§Ïà±È£¬×âÓýµµÍÁËÍøÂçµÄ·±Ã¦³Ì¶È£¬½«»á³ÉΪһÖַdz£ÊÜ»¶ÓµÄ½â¾ö·½°¸¡£
×ܽá
ÒªÌṩÍêÃÀµÄ¡¢Äܹ»Âú×ã´ó¶àÊýÉÌÎñÓ¦ÓÃÐèÇóµÄÔ¶³Ì´¦Àí¿ò¼Ü£¬¼´Ê¹Äܹ»×öµ½£¬Ò²±ØÈ»»á·Ç³£À§ÄÑ¡£Microsoft ÌṩÁËÄܹ»¸ù¾ÝÐèÒª½øÐÐÀ©Õ¹ºÍ×Ô¶¨ÒåµÄ¿ò¼Ü£¬ÔÚÕýÈ·µÄ·½ÏòÉÏÂõ³öÁ˹ؼüµÄÒ»²½¡£
¸½Â¼ A£ºÊ¹Óà TCP ͨµÀ½øÐÐÔ¶³Ì´¦ÀíµÄʾÀý
´Ë¸½Â¼ÏÔʾÁËÈçºÎ±àд¼òµ¥µÄ¡°Hello World¡±Ô¶³ÌÓ¦ÓóÌÐò¡£¿Í»§¶Ë½«Ò»¸ö×Ö·û´®´«µÝµ½Ô¶³Ì¶ÔÏóÉÏ£¬¸ÃÔ¶³Ì¶ÔÏ󽫵¥´Ê¡°Hi There¡±¸½¼Óµ½×Ö·û´®ÉÏ£¬²¢½«½á¹û·µ»Øµ½¿Í»§¶Ë¡£
½«´ËÎļþ±£´æÎª server.cs¡£´Ë´¦Îª·þÎñÆ÷µÄ´úÂ룺
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.TCP;
namespace RemotingSamples {
public class HelloServer : IHello {
public static int Main(string [] args) {
TCPChannel chan = new TCPChannel(8085);
ChannelServices.RegisterChannel(chan);
RemotingServices.RegisterWellKnownType(
"server", "RemotingSamples.HelloServer", "SayHello", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Çë°´
System.Console.ReadLine();
return 0;
}
public HelloServer()
{
Console.WriteLine("HelloServer ÒѼ¤»î");
}
~HelloServer()
{
Console.WriteLine("¶ÔÏóÒÑÇå³ý");
}
public ForwardMe HelloMethod(ForwardMe obj)
{
Console.WriteLine("Hello.HelloMethod : {0}", name);
return "Hi there " + name;
}
}
}
½«´Ë´úÂë±£´æÎª client.cs£º
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.TCP;
namespace RemotingSamples {
public class Client
{
public static int Main(string [] args)
{
TCPChannel chan = new TCPChannel();
ChannelServices.RegisterChannel(chan);
ForwardMe param = new ForwardMe();
HelloServer obj = (HelloServer)Activator.GetObject(
typeof(RemotingSamples.HelloServer), "tcp://localhost:8085/SayHello");
if (obj == null) System.Console.WriteLine("ÎÞ·¨¶¨Î»·þÎñÆ÷");
else {
Console.WriteLine("ֵΪ " + param.getValue());
ForwardMe after = obj.HelloMethod(param);
Console.WriteLine("ºô½ÐºóµÄֵΪ " + after.getValue());
}
return 0;
}
}
}
ÏÂÃæÊÇ makefile£º
all: server.exe client.exe share.dll
share.dll: share.cs
csc /debug+ /target:library /out:share.dll share.cs
server.exe: server.cs
csc /debug+ /r:share.dll /r:System.Runtime.Remoting.dll server.cs
client.exe: client.cs server.exe
csc /debug+ /r:share.dll /r:server.exe /r:System.Runtime.Remoting.dll client.cs
clean:
@del server.exe client.exe *.pdb *~ *.*~
¸½Â¼ B£ºÊ¹Óà HTTP ͨµÀ½øÐÐÔ¶³Ì´¦ÀíµÄʾÀý
½«´ËÎļþ±£´æÎª server.cs¡£´Ë´¦Îª·þÎñÆ÷µÄ´úÂ룺
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;
namespace RemotingSamples {
public class HelloServer : IHello {
public static int Main(string [] args) {
HTTPChannel chan = new HTTPChannel(8085);
ChannelServices.RegisterChannel(chan);
RemotingServices.RegisterWellKnownType(
"server", "RemotingSamples.HelloServer", "SayHello", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Çë°´
System.Console.ReadLine();
return 0;
}
public HelloServer()
{
Console.WriteLine("HelloServer ÒѼ¤»î");
}
~HelloServer()
{
Console.WriteLine("¶ÔÏóÒÑÇå³ý");
}
public ForwardMe HelloMethod(ForwardMe obj)
{
Console.WriteLine("Hello.HelloMethod : {0}", name);
return "Hi there " + name;
}
}
}
½«´Ë´úÂë±£´æÎª client.cs£º
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;
namespace RemotingSamples {
public class Client
{
public static int Main(string [] args)
{
HTTPChannel chan = new HTTPChannel();
ChannelServices.RegisterChannel(chan);
ForwardMe param = new ForwardMe();
HelloServer obj = (HelloServer)Activator.GetObject(
typeof(RemotingSamples.HelloServer), "http://localhost:8085/SayHello");
if (obj == null) System.Console.WriteLine("ÎÞ·¨¶¨Î»·þÎñÆ÷");
else {
Console.WriteLine("ֵΪ " + param.getValue());
ForwardMe after = obj.HelloMethod(param);
Console.WriteLine("ºô½ÐºóµÄֵΪ " + after.getValue());
}
return 0;
}
}
}
ÏÂÃæÊÇ makefile£º
all: server.exe client.exe share.dll
share.dll: share.cs
csc /debug+ /target:library /out:share.dll share.cs
server.exe: server.cs
csc /debug+ /r:share.dll /r:System.Runtime.Remoting.dll server.cs
client.exe: client.cs server.exe
csc /debug+ /r:share.dll /r:server.exe /r:System.Runtime.Remoting.dll client.cs
clean:
@del server.exe client.exe *.pdb *~ *.*~
--------------------------------------------------------------------------------
ÇëÒÔ IE4.0 ÒÔÉϰ汾 800 * 600 ä¯ÀÀ±¾Õ¾
©2001 Microsoft Corporation °æÈ¨ËùÓС£±£ÁôËùÓÐȨÀû¡£Ê¹Óù涨¡£

