在Web Service中使用ASP.net状态保持(4)

asp.net|web

下一步,我创建了一个简单的WinForm应用程序,并且将上述的Web Service添加到Web引用中。下面就是调用我的Web Service的代码:
' 这里并没有与Session打交道
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim proxy As New localhost.Service1()
Dim ret As Integer
ret = proxy.IncrementSessionCounter()
Label1.Text = "Result: " & CStr(ret)
End Sub

当我第一次调用Web Service时,一切正常,Web方法返回1,这就是那个Session变量的应有的初始值。现在我点击Button1来再次调用这个Web方法,我希望看到的返回值是2。可惜的是,无论我点击多少次Button1,返回值一直都是1。

你也许会怀疑原因就是我每次都创建了一个新的proxy类的实例去调用Web方法,因此每次我点击按钮,都会丢失上一次调用时的cookie。不幸的是,即使你将proxy类的初始化代码移到窗体的构造函数中,然后对每次Web方法调用使用同一个proxy类的实例,你还是不可能看到返回值有增加的迹象。

问题在于cookie。Web Service代码并未从调用请求中发现有效的会话ID,因此它每次被调用都创建一个全新的HttpSessionState对象,并且返回它的初始值1。因为作为客户端的proxy类是从类System.Web.Service.Protocols.SoapHttpClientProtocol继承的,它不包含System.Net.CookieContainer类的实例,因此,没有地方来存放返回的cookie。为了解决这个问题,我对代码做了如下一些修改:

' 使用了ASP.NET的session
' 但是并不是无Cookie的session.
Private Cookies As System.Net.CookieContainer

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim proxy As New localhost.Service1()
Dim ret As Integer
' 为proxy类设置cookie容器
If Cookies Is Nothing Then
Cookies = New System.Net.CookieContainer()
End If
proxy.CookieContainer = Cookies
ret = proxy.IncrementSessionCounter()
Label1.Text = "Result: " & CStr(ret)
End Sub

现在代码工作正常了!每点击一次Button1,我都可以看到返回值增加1。注意到我并不是在函数中声明变量Cookies的,它是窗体类的一个私有成员,因为如果希望每次都返回同一个会话ID给服务器的话,就必须在每次请求中使用CookieContainer类的同一个实例。这就解释了为什么SoapHttpClientProtocol类默认不自动地设置的cookie容器。正应为此,你可以在多个SoapHttpClientProtocol类的实例中共享一个cookie容器,而不是为其每个实例自动地创建一个新的cookie容器。

无cookie的Session从Web Service的开发者的角度来看,你可以想到相当多的人在试图使用你的Web服务时忘记在客户端代理类中添加Cookie容器。聪明的开发者或许灵光一闪,就会发现无cookie的Session应该可以出色地解决这个问题。如果将web.config文件中sessionState元素的cookieless参数设置为“true”,你将会发现,通过浏览器界面调用Web方法时,session变量工作正常,但是如果你在Visual Studio.net中通过“添加Web引用”来调用它时,依然存在着一些问题。

时间: 2024-09-17 03:57:48

在Web Service中使用ASP.net状态保持(4)的相关文章

Web Service中保持ASP.net的状态

asp.net|web 简介      网络程序开发者们遇到的最普遍的问题就是如何在无状态的基于HTTP协议的交互中保持状态信息.有许多聪明的办法可以解决HTTP协议的无状态问题,例如对每个请求重复发送应用程序数据包.使用HTTP认证机制来将请求映射到特定的用户.使用Cookie来存储一系列请求的状态等.在ASP.net技术中提供了一个非常有效的方案来保持状态,该方案隐藏了所有高难度的,具有挑战性的工作的细节,用户只需简单地使用System.Web.SessionState.HttpSess

ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Session,需要对Web Method做如下处理 [WebMethod(EnableSession = true)]public void usingSession(){    Session["Name"] = "Name";}   如果不加EnableSession = t

在Web Service中实现Transaction

web 在Web Service中实现Transaction.Net Framework为类,WebForm和WebService提供了事务处理功能.在传统的windows应用程序中,要写一个有事务处理功能的组件不仅要写代码而且要在组件服务中创建一个事务包.这就意味着在任何一台要处理这个事务的机器上,你都不得不打开mmc在COM+应用程序节点下创建一个新包..NET Framework使得这一切变得很简单,事实上我们不用在组件服务中作任何事,这一切都是自动完成的.对WebService来说,.N

在Web Service中使用Windows验证的方式

很多朋友都知道在Web Service中支持Windows验证.但其实能用好的朋友并不 是特别多,因为有几个特殊之处需要注意 1.在服务端如何配置 这里要注意的是,authentication的mode默认就是windows,但光是设置这个 模式则毫无用处.必须同时设置有关的authorization规则.并且不要光是allow ,最后一定要deny掉所有没有被allow的用户或者组 服务必须发布到IIS服务器中才真正可以进行调试.如果没有发布,而仅仅是 在VS里面调试,那么就无法进行一些设置,

Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此基础上又扩展成为了WCF,基于SOAP协议,基于WCF标准需要一些配置上的改变.现如今,大势所趋我们只需要HTTP协议以及更加优美的JSON格式,这时将不得不出现一个更加轻量级的Web服务技术.当然,Web Service和WCF虽然有其局限性但是其仍被许多企业所广泛应用,说明一时半会还不会被淘汰,

使用BizTalk Adatper for Web Service中的策略与技巧

web|策略|技巧 在使用BizTalk Adapter for Web Service的EAI解决方案中,不同的.分离的组件被整合在一起完成统一的商业逻辑.在解决方案中,各种组件必须很好的在一起工作.有两条关键的原则(key principle)可以使得你的BizTalk解决方案更完美: KP1:在搭建解决方案时,每一步实现均进行测试: KP2:丛最前端开始向后端推进,或丛最后端开始并向前端推进,一步一步进行增量开发.每进行一步增量开发,均要保证增量后解决方案可以使用. 下面分别加以描述,并对

web service中配置tcp/ip监视器

配置tcp/ip监视器(请求转发+请求信息记录) 监听port : 8989(wsdl文件中的address属性一致) 监听主机 :ip 转发的port : 8080(server端一致) 将webservice的wsdl文件保存到client应用中: helloWS.wsdl 修改helloWS.wsdl文件中的uri : port adresss属性 8080–>8989 在client应用的src下执行命令: wsimport -keep 本地wsdl文件->生成client端代码 借助

使用BizTalk Adatper for Web Service中的策略与技巧-Web_Servi

在使用BizTalk Adapter for Web Service的EAI解决方案中,不同的.分离的组件被整合在一起完成统一的商业逻辑.在解决方案中,各种组件必须很好的在一起工作.有两条关键的原则(key principle)可以使得你的BizTalk解决方案更完美:KP1:在搭建解决方案时,每一步实现均进行测试:KP2:丛最前端开始向后端推进,或丛最后端开始并向前端推进,一步一步进行增量开发.每进行一步增量开发,均要保证增量后解决方案可以使用.下面分别加以描述,并对其中的技巧进行指导. 1.

100问一个关于在asp.net web service中调用主页面中元素以及事件的问题!!!!!!!

问题描述 现在我在web中建了个webservice,现在我想在这个里面调用主页面即default页面里的东西,包括元素和后台事件比如页面里有个<asp:button.....>如何调用button的方法,比如后台有个函数aaaa()如何调用这个函数!!! 解决方案 解决方案二:你知道webservice是个什么东西吗?感觉你对webservice根本就不了解你只能把这些东西作为参数传过去解决方案三:建议楼主先了解下webservice解决方案四:webservice相当于一个远程函数库,它不