中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> .NET编程 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
· [图文] 利用 ASP.NET 的内置...
· .NET之ASP Web Appl...
· .NET之ASP Web Appl...
· .NET之ASP Web Appl...
· .NET之ASP Web Appl...
· .NET之ASP Web Appl...
· ASP.NET Web Page应...
· Web Service中保持A...
· Web Service中保持A...
· ASP.NET Web Servic...
Web Service中保持ASP.net的状态(3)
作者:不详  来源:不详  发布时间:2006-8-14 9:05:58  发布人:chinazhan

 减小字体 增大字体

     无cookie的Session
  
  从Web Service的开发者的角度来看,你可以想到相当多的人在试图使用你的Web服务时忘记在客户端代理类中添加Cookie容器。聪明的开发者或许灵光一闪,就会发现无cookie的Session应该可以出色地解决这个问题。如果将web.config文件中sessionState元素的cookieless参数设置为“true”,你将会发现,通过浏览器界面调用Web方法时,session变量工作正常,但是如果你在Visual Studio.net中通过“添加Web引用”来调用它时,依然存在着一些问题。
  
  为了研究无cookie的session,我决定使用上面已经使用过的代码,看看它能否在session状态被设置为cookieless的服务器环境中能否工作正常。我也不想费心去删除cookie容器的相关代码,因为我希望得到能在两种session状态下都正常工作的代码。作为一个天生的乐观主义者,我一个字也不改就直接运行它。令人失望的事发生了——不过也不是完全没有想到,我不得不面对这个异常:
  
  An unhandled exception of type 'System.Net.WebException' occurred in system.web.services.dll
  
  Additional information: The request failed with the error message:
  --
  <html><head><title>Object moved</title></head><body>
  <h2>Object moved to <a href='/HttpSessionState/(l2z3psnhh2cf1oahmai44p21)/service1.asmx'>here</a>.</h2>
  </body></html>
  
  发生了什么呢?原来HTTP请求收到的不是“200 OK”响应。如果你熟悉HTTP协议,你或许可以从响应中的HTML代码中发现这是一个“302 Found”响应,这意味着该请求被重定向到超链接中指定的地址。返回HTML代码是很明智的,这样如果一个浏览器因为某些原因不支持重定向的话,它可以把代码显示出来,或者在重定向过程中显示这些代码直到重定向完成。注意到超链接中包含了一个有趣的字符串“(l2z3psnhh2cf1oahmai44p21)”,显然,我们可以推断这就是ASP.net的会话ID,它被嵌入了我们要重定向到的位置的URL中。在客户端代理中,我们需要做的仅仅是重新发送请求到这个新的URL。
  
  无须再在Win32 WinInet API编程中跋涉,我们可以直接找到proxy类的一个属性允许自动重定向。用外行人的说法,就是如果我们接收到一个“302 Found”响应,就直接将请求重新发送到相应中HTTP位置头所指示的URL。当Visual Studio.net的智能提示显示proxy类的AllowAutoRedirect属性时,我感到这东西真是机灵得可爱。我马上就在代码中加上如下一行:
  
    proxy.AllowAutoRedirect = True
  
  我认为这仍然比创建一个CookieContainer类并关联到proxy类要容易得多,于是我又一次运行程序。很不幸,我遭遇了如下异常(为了简洁起见有所删节):
  
  An unhandled exception of type 'System.InvalidOperationException' occurred
  in system.web.services.dll
  
  Additional information: Client found response content type of 'text/html; charset=utf-8',
  but expected 'text/XML'.
  
  The request failed with the error message: …
  
  如果你看到错误消息的内容,你会发现你所看到的HTML页面跟你浏览.ASMX文件的页面一样。问题是,为什么当我传送XML(以SOAP封装了的形式)到Web Service服务器时它返回的却是HTML代码?结果证实,你并没有在SOAP封装中发送HTTP POST请求,而仅仅发送了一个简单的没有内容的HTTP GET请求,因此你的Web Service服务端理所当然地假设这个请求来自浏览器,于是它返回普通的HTML响应。为什么会这样呢?
  
  如果你了解HTTP协议,你会发现一个HTTP客户端在收到“302 Found”响应时发送HTTP GET请求到响应中指定的地址是合情合理的,即使初始请求是HTTP POST。这种方式下浏览器工作得很好,因为开始几乎所有的请求都是HTTP GET类型的,只有当你试图传递数据到一个URL时,才会出现上述失败的结果。
  
  理由是在传送的数据中可能包含潜在的敏感数据,因此你需要确认是否用户真的想向新的资源传送数据。显然如果你转向基于重定向设置的新地址,你就没能确认用户是否真的允许将他们的数据发送到新的地址。因此数据并没有被发送,而代之以简单的HTTP GET请求。
  
  我对代码做了如下修改,捕获“302 Found”异常,提示用户同意重定向他们的请求,然后再次在新的位置调用我的Web方法。
  
  ' 同时使用基于Cookie和Cookie的Session
  Private Cookies As System.Net.CookieContainer
  Private WebServiceUrl as Uri
  
  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
  ' 设置proxy类的URL
  If webServiceUrl Is Nothing Then
  webServiceUrl = New Uri(proxy.Url)
  Else
  proxy.Url = webServiceUrl.AbsoluteUri
  End If
  Try
  ret = proxy.IncrementSessionCounter()
  Catch we As WebException
  ' 如果我们想检测HTTP状态码
  ' 那么就需要一个HttpWebResponse类的实例
  If TypeOf we.Response Is HttpWebResponse Then
  Dim HttpResponse As HttpWebResponse
  HttpResponse = we.Response
  If HttpResponse.StatusCode = HttpStatusCode.Found Then
  ' 这是一个“302 Found”响应,提示用户是否进行重定向
  If MsgBox(String.Format(redirectPrompt, _
  HttpResponse.Headers("Location")), _
  MsgBoxStyle.YesNo) = _
  MsgBoxResult.Yes Then
  ' 用户选择Yes,重新尝试新的URL
  webServiceUrl = New Uri(webServiceUrl, _
  HttpResponse.Headers("Location"))
  Button1_Click(sender, e)
  Return
  End If
  End If
  End If
  Throw we
  End Try
  Label1.Text = "Result: " & CStr(ret)
  End Sub
  
  
  现在ASP.NET的Session工作正常了。在你的应用程序中,你可以根据情况自行决定是否提示用户重定向HTTP POST请求。举一个例子,如果你正在调用一个Web Service,你也许就不希望出现任何可见的对话框。
  
  这样看来,要使ASP.net的Session完全正常地工作还真不是很容易。但是,应该意识到上面的代码所展示的原理在其他情况下一样的有用。例如,任何平台上的任何Web Service,只要它使用HTTP cookie,都需要一个cookie容器,类似地,也许有很多其他的原因导致当你向一个Web Service服务器发送请求时收到“302 Found”响应。在一个复杂的应用程序中调用Web Service时,可能有许多特殊的情形需要你去处理,cookie和重定向的问题就是两种这样的情形,你应该将之作为你的Web Service调用代码中最基本的部分。
  
    结 论
  
    在你调用Web方法的过程中,ASP.net对状态保持是非常有用的,你必须意识到,当你使用手边的浏览器界面测试你的Web Service时,你并没有面对客户端程序必须处理的问题。幸运的是,这些问题并不是很难解决。
  
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。

 
[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .