.NET Compact Framework在调用Axis实现的WebService中如何维持Session


        最近在一个WinCE的设备上开发应用,通过GPRS上网调用WebService。服务端用java开发的,使用Axis的实现标准。发现.NET Compact Framework没有实现System.Net.CookieContainer,没法在WinCE的客户端保持会话。
        后来通过分析Web请求响应的Http消息头,了解到Axis的Session是通过Cookie来管理,并通过在Http消息头中加入Cookie:JSESSIONID=XS52V1MBNVOAAQSNDBESKHA 进行传递的。在确定了问题原因之后,解决方案就比较简单了:
        1、调用login成功的时候服务器返回SessionId;
        2、截获HttpWebRequest,加入该消息头。代码如下:
--托管Web服务客户端代理--
 1 None.gif using  System;
 2 None.gif using  System.Net;
 3 None.gif using  MyTest.DataTransfer.WebReference;
 4 None.gif
 5 None.gif namespace  MyTest.DataTransfer
 6 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 8InBlock.gif    /// 数据传输适配器,用来托管web service接口.
 9ExpandedSubBlockEnd.gif    /// </summary>

10InBlock.gif    public sealed class TransmitAdapter : MyTestService
11ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
12InBlock.gif        private string _jSessionID = string.Empty;
13InBlock.gif        private static TransmitAdapter _instance;
14InBlock.gif        private TransmitAdapter() : base()
15ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
16ExpandedSubBlockEnd.gif        }

17InBlock.gif
18InBlock.gif        //FIXUP: An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll?
19InBlock.gif        protected override WebRequest GetWebRequest(Uri uri)
20ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
21InBlock.gif            HttpWebRequest httpWebReq = base.GetWebRequest(uri) as HttpWebRequest;
22InBlock.gif            if (!string.IsNullOrEmpty(_jSessionID))
23ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
24InBlock.gif                httpWebReq.Headers.Add("COOKIE""JSESSIONID=" + _jSessionID);
25ExpandedSubBlockEnd.gif            }

26InBlock.gif            httpWebReq.AllowWriteStreamBuffering = true;
27InBlock.gif            return httpWebReq;
28ExpandedSubBlockEnd.gif        }

29InBlock.gif
30ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
31InBlock.gif        /// singleton.
32ExpandedSubBlockEnd.gif        /// </summary>

33InBlock.gif        public static TransmitAdapter Instance
34ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
35InBlock.gif            get
36ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
37InBlock.gif                if (_instance == null)
38ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
39InBlock.gif                    _instance = new TransmitAdapter();
40ExpandedSubBlockEnd.gif                }

41InBlock.gif                return _instance;
42ExpandedSubBlockEnd.gif            }

43ExpandedSubBlockEnd.gif        }

44InBlock.gif
45ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
46InBlock.gif        /// Session Id.
47ExpandedSubBlockEnd.gif        /// </summary>

48InBlock.gif        public string SessionID
49ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
50ExpandedSubBlockStart.gifContractedSubBlock.gif            get dot.gifreturn _jSessionID; }
51ExpandedSubBlockStart.gifContractedSubBlock.gif            set dot.gif{ _jSessionID = value; }
52ExpandedSubBlockEnd.gif        }

53ExpandedSubBlockEnd.gif    }

54ExpandedBlockEnd.gif}

--调用Web服务--

None.gif string  sessionId  =  MyTest.DataTransfer.TransmitAdapter.Instance.login(userName, password);
None.gif
if  ( string .IsNullOrEmpty(sessionId))
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//失败.
ExpandedBlockEnd.gif
}

None.gifMyTest.DataTransfer.TransmitAdapter.Instance.SessionID 
=  sessionId;
None.gif
//  OK?
None.gif
bool  isAvaiable  = MyTest.DataTransfer.TransmitAdapter.Instance.checkSession();

参考资源:
Session Management in ASP.NET
Thin Client for Microsoft Visual SourceSafe on Pocket PC / SmartPhones

转载于:https://www.cnblogs.com/bengxia/archive/2006/05/28/411210.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值