在Silverlight开发基于http协议客户端连接器(三)

 

下面应用前面设计的这个连接器演练一个登录服务并保持session。

image

先定消息,就是用LoginMessage好了。

这里说明一下,很多页面访问的时候都是需要验证的,比如qq、178的游戏页面都会包含appid,sessionkey,uid之类的信息,这样就能够防止非注册用户访问他们的webgame。所以我们还要收集html中的这些数据用于登录用。在silverlight中可以通过HTML Bridge来获取DOM,其实用起来也很简单,在js中写function,再在sl中调用HtmlPage.Window.Invoke(方法名,参数名……)。

下面是获取某页面验证信息用的的工具类:

 

 

ExpandedBlockStart.gif PageMessageUtil
public   static   class  PageMessageUtil 
   { 
       
public   static  PageSignEntity GetData() 
       { 
           
if  (( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_uid " !=   ""
           { 
               var entity 
=   new  PageSignEntity(); 
               entity.Id 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_uid " ); 
               entity.Signtime 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_time " ); 
               entity.Appid 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_appId " ); 
               entity.Appversion 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_v " ); 
               entity.Isaddapp 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_added " ); 
               entity.Sessionkey 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_sessionId " ); 
               entity.Friendlist 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_friends " ); 
               entity.Signsumber 
=  ( string )HtmlPage.Window.Invoke( " get178PageData " " 178_sig_key " ); 
               
return  entity; 
           } 
           
else  
           { 
               MessageBox.Show(
" 没有给定参数 " ); 
               System.Diagnostics.Debug.WriteLine(
" 没有给定参数 " ); 
               
return   null
           } 
       } 
   }

 

 

ExpandedBlockStart.gif PageSignEntity
public   class  PageSignEntity 
    { 
        
public  PageSignEntity() 
        { 
        } 
        
public   string  Id {  get set ; } 
        
public   string  Signtime {  get set ; } 
        
public   string  Appid {  get set ; } 
        
public   string  Appversion {  get set ; } 
        
public   string  Isaddapp {  get set ; } 
        
public   string  Sessionkey {  get set ; } 
        
private   string  friendList; 
        
public   string  Friendlist 
        { 
            
get  {  return  friendList; } 
            
set  
            { 
                friendList 
=  value  ??   string .Empty; 
            } 
        } 
        
public   string  Signsumber {  get set ; } 
    }

 

继承Message,设置有效的url参数

 

ExpandedBlockStart.gif LoginMessage
public   class  LoginMessage : Message 
    { 
        
public    readonly   static   string  Uid  =   " 178_sig_uid "
        
public   readonly   static   string  Signtime  =   " 178_sig_time "
        
public   readonly   static   string  Appid  =   " 178_sig_appId "
        
public   readonly   static   string  Appversion  =   " 178_sig_v "
        
public   readonly   static   string  Isaddapp  =   " 178_sig_added "
        
public   readonly   static   string  Sessionkey  =   " 178_sig_sessionId "
        
public   readonly   static   string  Friendlist  =   " 178_sig_friends "
        
public   readonly   static   string  Signsumber  =   " 178_sig_key "
        
public  LoginMessage() 
        { 
            init(); 
        } 
        
public  LoginMessage(PageSignEntity dataEntity) 
        { 
            init(); 
            
base .Parameters[LoginMessage.Uid]  =  dataEntity.Id; 
            
base .Parameters[LoginMessage.Appid]  =  dataEntity.Appid; 
            
base .Parameters[LoginMessage.Appversion]  =  dataEntity.Appversion; 
            
base .Parameters[LoginMessage.Signtime]  =  dataEntity.Signtime; 
            
base .Parameters[LoginMessage.Signsumber]  =  dataEntity.Signsumber; 
            
base .Parameters[LoginMessage.Sessionkey]  =  dataEntity.Sessionkey; 
            
base .Parameters[LoginMessage.Isaddapp]  =  dataEntity.Isaddapp; 
            
base .Parameters[LoginMessage.Friendlist]  =  dataEntity.Friendlist; 
        } 
        
private   void  init() 
        { 
            
base .MessageId  =   " 10000 "
            
// 可以用反射少些代码,或用code generater的方式 
             base .AvaliableParameterNames.Add(Uid); 
            
base .AvaliableParameterNames.Add(Signtime); 
            
base .AvaliableParameterNames.Add(Appid); 
            
base .AvaliableParameterNames.Add(Appversion); 
            
base .AvaliableParameterNames.Add(Isaddapp); 
            
base .AvaliableParameterNames.Add(Sessionkey); 
            
base .AvaliableParameterNames.Add(Friendlist); 
            
base .AvaliableParameterNames.Add(Signsumber); 
        } 
    }

 

我们从WebConnectorContext继承来一个LkDemoDomainService。

 

ExpandedBlockStart.gif LkDemoDomainService
public   class  LkDemoDomainService : WebConnectorContext 
    { 
        
public  LkDemoDomainService( string  baseAddress) 
            : 
base (baseAddress) 
        { 

        } 
        
public   void  LoginGameFromPageSign() 
        { 
            LoginGameFromPageSign(
" http://localhost:8085/igscdemo/login.sa%22); 
        } 
        
public   void  LoginGameFromPageSign( string  loginUrl) 
        { 

            var msg 
=   new  LoginMessage(PageMessageUtil.GetData()); 
            var loginService 
=   new  LkDemoDomainService(loginUrl); 
        } 

        
public    void  Login(Message msg, Action < WebClientWrapper,  string >  action) 
        { 
           loginService.AddMessageToSend(msg, (client, s) 
=>  
            {

                
// 解析返回的结果,略 
                 base .AppCookie  =  loginService.AppCookie; // 保存用户sessionid等

               
// 提示登录结果,略 
            });

        }

        
public   override   void  AddMessageToSend(Message msg, Action < WebClientWrapper,  string >  action) 
        { 
            
base .AddMessageToSend(msg, action); 
        } 
    }

 

之后我们假如有LichKingGameDomainService继承于WebConnectorContext,只需将登录的AppCookie设置给LichKingGameDomainService对象即可使LichKingGameDomainService对象发送出去的消息含有用户的sessionid等cookie值。

转载于:https://www.cnblogs.com/wJiang/archive/2010/09/02/1816269.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值