哪位童鞋来说一说WebService对象的生命周期(LifeCycle)?

前提,一般情况下.net的WebService对象是无状态的,如果要使用Session状态,那么MS给出了一个解决方案如下:

Article ID: 816637 - Last Review: May 16, 2007 - Revision: 2.4
HOW TO: Use CookieContainer to Maintain a State in Web Services When You Use Visual C# .NET
http://support.microsoft.com/kb/816637/en-us/


网上很多人问这个问题,简单地分析了一下诸多的回复,说的都是这么一回事。

但是,这个方案也是有局限性的,简单的说该方案分为两部分,
作为WebService端,需要通过EnableSession属性启用状态支持,
作为客户端,需要使用CookieContainer来实现跟WebService端状态的交换。

局限性就在客户端,对于这种方案,客户端必须是ASP.NET(WebForm),
而不能是一个普通的html(JavaScript),也不能是一个WinForm。
当然可能会有人想到编码模拟实现CookieContainer的功能,技术上大概没问题,只是代价太大了。

又或许是我的设计思路不恰当,比如说,或许我应该这样理解,
要么把WebService设计成无状态的,
要么就使用ASP.NET(WebForm)作为客户端。

但是作为一个新手,在没有把WebService技术的里里外外弄明白之前,还不能下这样的决定。
当年学习EJB的时候,就知道SUN规定了两种SessionBean,有状态的,无状态的,可以各取所需,
我想MS应该有MS的考虑。

作为另一个前提,我想知道对于MS的技术而言WebService对象的生命周期
(※此处特指从WebService类继承的类的对象),
比如说,这个类的实例是由谁、什么时候创建的?跟客户端的方法调用的关系?
在客户端的连续或非连续的多次方法调用下,该实例的状态发生什么样的变化?
最后这个实例是由谁、什么时候销毁的?有没有使用对象池、钝化、活化这样的技术管理?

如此等等。
很遗憾的是我在web以及microsoft.com做了很多搜索,也翻了好几本MS WebService方面的专著,
竟然没有找到我想要的答案,只是有人提到【.NET Remoting】是“有状态”的,但我目前不能采用。

----------------------------------------------------------------------------------

(未完待续)

依 http://topic.csdn.net/u/20100810/14/162e37de-0cb0-4f4b-b8cd-0807eb55fe04.html?41163

一帖的讨论而定。

----------------------------------------------------------------------------------

(后续讨论)

----------------------------------------------------------------------------------

Marguess提到:

看看WCF的双工模式吧

WCF中有三种实例模式:PerSession,PerCall,Single 
PerCall模式:
  客户端创建代理对象(Proxy).
  客户端调用代理对象的一个Contract,代理对象将其传递给服务宿主.
  宿主应用程序创建一新的ServiceContract,并且执行请求操作.
  在执行完请求操作后,如果要求有应答,那么ServiceContract会给代理对象一个应答,然后销毁自己(如果实现了IDisposable,则调用Dispose())

PerSession模式:
  客户端创建代理对象(Proxy).
  客户端第一次调用代理对象的一个Contract操作,代理对象将其调用请求传递给服务宿主.
  宿主程序创建新的服务对象,并执行请求操作,如果有必要,返回客户端应答.
  客户端再次发出调用操作的请求,宿主会先判断是否已有建立好的会话,如果存在,则不需要再创建新的服务对象,直接使用老对象即可。 
  在时间达到指定要求或者因一些特殊原因,会话会过期,此时服务对象销毁。

Single模式:
  服务端启动,同时创建服务对象.
  客户端通过代理调用契约操作.
  第一步中创建的服务对象接受请求,并执行操作,进行必要的应答.
  第一步创建的服务对象将一直保留.
  服务关闭,第一步创建的对象销毁.

PerCall模式:
  当一个请求操作来到的时候,再创建服务对象,申请必要资源,而当操作完毕之后,立即销毁对象并释放资源,留给下一个请求。这就可能大大提高服务端的吞吐能力。WCF中默认就是这种。

PerSession模式:
  与传统的C/S模式应用程序非常相似,它能在服务端和客户端维护状态,当一个服务对象创建之后不会马上销毁,而是等待客户端再次来消费它,那这种的坏处就是可能会浪费宝贵的服务资源,可也是有好处的,比如它能够保持连接和维护状态,这在要求有回调的情况下特别重要.还有一种情况,服务端操作不需要比较多的资源或者占用的资源也不宝贵的情况下,而却与客户端在不同的网络中,它们之间进行一次连接比较费时,这时也适用于此种实例模式。

Single模式:
  这种看名字就知道,通俗地说就是服务请求在一个队列里面,只有一个服务,服务请求而且必须是上一个处理完了,才有下一个。

----------------------------------------------------------------------------------

wingtrace提到:

Marguess兄弟,先多谢了。
WCF我还是第一次接触,一时半会还搞不懂的。。
你的意思是,WebService的生命周期跟WCF的双工模式一致?
还是可以在我的工程中导入WCF,由WCF管理WebService的生命周期呢?

----------------------------------------------------------------------------------

Marguess提到:

ASP.NET Web Services 和 .NET Remoting 现在合并成了WCF

----------------------------------------------------------------------------------

wingtrace提到:

啊。。原来如此。。。这是什么时候的事情啊?

我还在弄.NET 2.0时代的东西,这圡的。。

。。。。。。

明白了,是VisualStudio2008以及.NET Framework 3.x时代的东西。。。
参考 http://dev.yesky.com/402/8079902.shtml

----------------------------------------------------------------------------------

wingtrace提到:

在msdn找到一篇对比ASP.NET Web Services or .NET Remoting的文章,
其中提到了状态管理这一节,可惜的是对于最后一句话,也是没有提到具体的解决方案。。

ASP.NET Web Services or .NET Remoting: How to Choose
 http://msdn.microsoft.com/en-us/library/ms978420.aspx

The ASP.NET Web Services model assumes stateless service architecture by default; it does not inherently correlate multiple calls from the same user. In addition, each time a client invokes an ASP.NET Web service, a new object is created to service the request. The object is destroyed after the method call completes. To maintain state between requests, you can either use the same techniques used by ASP.NET pages, i.e., the Session and Application property bags, or you can implement your own custom solution.

----------------------------------------------------------------------------------

wingtrace提到:

我觉得从最后两句话看来WebService实例的生命周期已经明朗了(假定msdn灰常靠谱),
难道是因为简单,所以就不重要?没有明确的资料对此作定义?天。。。

接下来的讨论,可以从最后一句入手,
To maintain state between requests, you can either use the same techniques used by ASP.NET pages, i.e., the Session and Application property bags, or you can implement your own custom solution. 

1、Session and Application property bags
  具体怎么做呢?思路。。
  从此也可以引出另一个话题:设定WebMethod 的 EnableSession属性为true之后,
  WebService的生命周期会发生什么样的变化??

2、you can implement your own custom solution
  这个我大概明白,估计还是得搞一套复杂的机制自己维护自造的“Session”的状态。。
  大伙儿有更好的思路么?

----------------------------------------------------------------------------------

hbifts from newsmth提到:
自己在服务器端保存Session,给Client一个Session ID,修改协议,让每次WS Request带上这个Session ID,不就可以有状态了。

WS就跟Http一样,自己是无状态的。

----------------------------------------------------------------------------------

wingtrace提到:

  我们确实有一套使用类似于这种方案的老系统,但是目前不打算这么做,
  因为实际上这个Session ID在客户端以及服务端的维护是比较复杂的。

  因为现在是对技术的可行性进行评估,如果不合适的话可能就放弃了WebService了。
  如果拿WebService比照RPC或RMI,那么服务端的WebService实例的生命周期在客户端
  是可以控制的,这样的话状态问题就可以简化解决(在客户端把该服务当普通对象使
  用就可以了),就像一个ejbs在客户端narrow之后就是一个普通的对象,客户端可以
  无视服务端到底是怎样管理这个对象的生命周期的,而服务端也只管实现跟生命周期
  管理相关的接口,无需关注客户端是怎样调用的。。

----------------------------------------------------------------------------------

(未完待续)

----------------------------------------------------------------------------------

以下是来自水木社区的讨论:

☆─────────────────────────────────────☆
  
hbifts (You're beautiful, it's true) (Tue Aug 10 15:30:16 2010) 提到:
  
  
自己在服务器端保存Session,给Client一个Session ID,修改协议,让每次WS Request带上这个Session ID,不就可以有状态了。
  
WS就跟Http一样,自己是无状态的。
  
【 在 i00i (烟·造爷) 的大作中提到: 】
: 前提,一般情况下.net的WebService对象是无状态的,如果要使用Session状态,
: 那么MS给出了一个解决方案如下:
: Article ID: 816637 - Last Review: May 16, 2007 - Revision: 2.4
: ...................

 
  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 16:01:30 2010) 提到:
  
   我们确实有一套使用类似于这种方案的老系统,但是目前不打算这么做,
   因为实际上这个Session ID在客户端以及服务端的维护是比较复杂的。
  
   因为现在是对技术的可行性进行评估,如果不合适的话可能就放弃了WebService了。
   如果拿WebService比照RPC或RMI,那么服务端的WebService实例的生命周期在客户端
   是可以控制的,这样的话状态问题就可以简化解决(在客户端把该服务当普通对象使
   用就可以了),就像一个ejbs在客户端narrow之后就是一个普通的对象,客户端可以
   无视服务端到底是怎样管理这个对象的生命周期的,而服务端也只管实现跟生命周期
   管理相关的接口,无需关注客户端是怎样调用的。。
  
【 在 hbifts (You're beautiful, it's true) 的大作中提到: 】
: 自己在服务器端保存Session,给Client一个Session ID,修改协议,让每次WS Request带上这个Session ID,不就可以有状态了。
: WS就跟Http一样,自己是无状态的。
  
  
  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 16:03:53 2010) 提到:
  
   http://www.w3.org/TR/wslc/
   Web Service Management: Service Life Cycle
  
   对此的描述比较粗糙,而且只是一般性的规定,MS怎么做的当然也不会提到。。

  
  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 16:46:39 2010) 提到:
  
在msdn找到一篇对比ASP.NET Web Services or .NET Remoting的文章,其中提到了
状态管理这一节,可惜的是对于最后一句话,也是没有提到具体的解决方案。。
  
ASP.NET Web Services or .NET Remoting: How to Choose
  http://msdn.microsoft.com/en-us/library/ms978420.aspx
  
The ASP.NET Web Services model assumes stateless service architecture by default; it does not inherently correlate multiple calls from the same user. In addition, each time a client invokes an ASP.NET Web service, a new object is created to service the request. The object is destroyed after the method call completes. To maintain state between requests, you can either use the same techniques used by ASP.NET pages, i.e., the Session and Application property bags, or you can implement your own custom solution.  

☆─────────────────────────────────────☆
  
sayinger (言者) (Tue Aug 10 18:14:31 2010) 提到:
  
不存在客户端必须是ASP.NET(WebForm)这回事,当然,如果你想啥都不干就让所有客户端都支持M$的方案那显然是痴心妄想。类似的,SUN的方案也不可能是随便一个html啥都不做就能支持的。Session,顾名思义,客户端服务端都得做相应的协调,否则鸡同鸭讲互相谁也不明白谁。
WS系列连事务都支持,怎么可能搞不定Session。当然,不是走Cookie这种猥琐的路子,无非是Soap里面扩展一堆东西,虽然各家的故事不一样,但好歹都是WSDL,大家都能听懂。就看你比较喜欢哪个故事...
  

☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 18:38:53 2010) 提到:
  
呃。。从msdn只找到那么一个用cookiecontainer的例子,其它就不知道了。。
目前客户端是msdn推荐的webservice.htc,原则上是不引进太高的复杂性,不直接操纵soap,在这些前提下有什么合适的方案么?
如果是微软推荐的有广泛使用的soap的扩展也可以,例如wse(不肯定这例子对不对),但是需要适用于ie。

☆─────────────────────────────────────☆
  
sayinger (言者) (Tue Aug 10 18:44:17 2010) 提到:
  
这么说吧,同样这个问题,如果是SUN的方案,你准备怎么做
  
总觉得你这个问题描述得有点莫名其妙,ie啥时候能认识soap了

  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 19:14:43 2010) 提到:
  
嗯。。我没有将来龙去脉说清楚,呵呵。
  
我们的想法是,
·客户端用IE,IE加载一个html,该html里面使用ms的webservice.htc,
   该htc文件封装了webservice的操作
   详见http://msdn.microsoft.com/en-us/library/ms531033(v=VS.85).aspx
·服务端用asp.net WebService
  
业务上的要求是,
客户端调用服务端的一个WebService,连续调用该WebService的若干个方法
完成一个业务,这若干个方法需要共享一些数据。

☆─────────────────────────────────────☆
  
sayinger (言者) (Tue Aug 10 20:01:08 2010) 提到:
  
没问题,M$的这个webservice.htc提供了对Soap的基础封装,你完全可以把身份验证、Session之类的东西加到SoapHeader里,然后在客户端里进行操作。
首先在服务端扩展一个你自定义的SoapHeader,最简单的里面就只有一个SessionId
比方说,当业务开始时,服务端生成并保存一个SessionId,并将这个SessionId返回给客户端,客户端拿到这个SessionId,在之后的方法调用中将这个SessionId放在相应的SoapHeader中传给服务端,这样不就实现了状态的保持。
  
其实Session就是一概念,退一万步你完全可以把SessionId作为一个参数放到你的每个方法里,丑就丑一点。
  
注意不要把Session跟ASP.NET的Session实现混淆起来。
  

☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Tue Aug 10 20:19:33 2010) 提到:
  
   嗯,非常感谢。:)
   我先仔细思考一下这个方案,明天上班再实践。
  
   应该下面的这个例子可以参考吧:
   http://www.cnblogs.com/zhleonix/archive/2006/06/16/423801.html

☆─────────────────────────────────────☆
  
sayinger (言者) (Tue Aug 10 20:27:11 2010) 提到:
  
可以,这样看上去比较不土...

☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 21:45:50 2010) 提到:
  
   依照昨天的讨论,今天实践了一下,成功了,目前遗留两个问题,
   其中一个跟昨天的话题有关,一并贴出来吧。:)
  
   1、目前是采用自定义SoapHeader(包含SessionID)的方案,
      在服务端设计一个诸如StartSession的WebMethod,作为客户端的第一个入口,
      在StartSession里面做成一个guid,作为要共享数据的对象的key,将该对象
      保存在Application里,例如Application.Add(guid_key, obj)。
  
      这样就没有使用WebMethod的EnableSession属性,所以,从WebService派生
      出来的Service实例实际上还是无状态的,对此并没有影响。
  
      一个会话结束的时候,由客户端显式调用服务端的诸如EndSession方法,
      该方法里面清除本次会话中保留的对象,例如Application.Add(key)。
  
      目前的问题是,被存放在Application里面的那些对象,怎样定时清理呢?
      一般情况下,客户端总能正常成对调用StartSession和EndSession,
      但是遇到诸如客户端死机、停电、断网、进程崩溃之类的场合,
      EndSession将不会被正确调用。
  
      临时做了一个很土的方案,就是每次StartSession的时候检查一下Application
      里面有没有存在超过20分钟的“Session”,有的话则Remove。问题是,假定
      在短时间内生成了1000个会话并没有正确释放,但是下一次的StartSession则
      发生在很久以后,那么在此期间,那1000个会话的对象将长时间占用内存。
      对于这个问题怎样解决比较好呢?
  
   2、待续。。。

  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 21:54:04 2010) 提到:
  
   2、(这个问题还没来得及深入调查,描述也不是很清楚,见谅。。。)
     SSL的证书问题。该应用要求使用SSL加密,并且要求客户端证书,
     在使用WebService.htc的情况下,怎样将客户端(IE)证书传递到服务端呢?
     是编码将证书用base64编码成文本传过去,还是像asp.net那样ie端自动发送,
     服务端通过HttpRequest取得即可?
 

  
☆─────────────────────────────────────☆
  
hbifts (You're beautiful, it's true) (Wed Aug 11 22:00:14 2010) 提到:
  
  
Session不是永久保存的,加上过期时间,定期检查、清除遗留的过期Session就行了。

 
☆─────────────────────────────────────☆
  
hbifts (You're beautiful, it's true) (Wed Aug 11 22:02:40 2010) 提到:
  
  
客户端证书,IIS支持client certificate authentication
详细信息:
http://msdn.microsoft.com/en-us/library/ff649247.aspx
  
【 在 i00i (烟·造爷) 的大作中提到: 】
:   2、(这个问题还没来得及深入调查,描述也不是很清楚,见谅。。。)
:     SSL的证书问题。该应用要求使用SSL加密,并且要求客户端证书,
:     在使用WebService.htc的情况下,怎样将客户端(IE)证书传递到服务端呢?
: ...................


☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 22:22:08 2010) 提到:
  
   asp.net的Session的生命周期我理解,使用它的话就不用自己操心了。。
  
   现在用的“Session”已经不是asp.net的Session了,此时对WebService
   的调用依然是无状态的,每一次的WebMethod调用,就会创建并销毁一次
   WebService对象。
  
   现在的Session的生命周期(如果不加管理的话)已经跟Application一样长了。。
  
【 在 hbifts (You're beautiful, it's true) 的大作中提到: 】
: Session不是永久保存的,加上过期时间,定期检查、清除遗留的过期Session就行了。
  
  
  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 22:29:51 2010) 提到:
  
多谢。:)
  
这个文章讲得比较浅,而且很奇怪即使在Web services这一段,将的仍然是
asp.net的事情,没看出来跟WebService有什么实际关系。。
  
【 在 hbifts (You're beautiful, it's true) 的大作中提到: 】
: 客户端证书,IIS支持client certificate authentication
: 详细信息:
: http://msdn.microsoft.com/en-us/library/ff649247.aspx

  
  
  
☆─────────────────────────────────────☆
  
sayinger (言者) (Wed Aug 11 22:33:36 2010) 提到:
  
session的一个本质特征就是时效性,不应存在永远有效的session,所以你需要设计一个过期机制。就asp.net而言,可以用它的cache。

 
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 22:38:14 2010) 提到:
  
   是。
  
   多谢,cache作为明天的调查课题了。:)
  
【 在 sayinger (言者) 的大作中提到: 】
: session的一个本质特征就是时效性,不应存在永远有效的session,所以你需要设计一个过期机制。就asp.net而言,可以用它的cache。
  
  
  
☆─────────────────────────────────────☆
  
sayinger (言者) (Wed Aug 11 22:48:09 2010) 提到:
  
这应该是浏览器处理的事情,你不用关心
  
不过要注意,从一个http页面发起对https页面的xhr,在ie里会被拒绝
  
所以你的页面都得走https
  
【 在 i00i (烟·造爷) 的大作中提到: 】
:   2、(这个问题还没来得及深入调查,描述也不是很清楚,见谅。。。)
:     SSL的证书问题。该应用要求使用SSL加密,并且要求客户端证书,
:     在使用WebService.htc的情况下,怎样将客户端(IE)证书传递到服务端呢?
:     是编码将证书用base64编码成文本传过去,还是像asp.net那样ie端自动发送,
:     服务端通过HttpRequest取得即可?


☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Wed Aug 11 22:59:42 2010) 提到:
  
非常感谢你的耐心。:)
  
【 在 sayinger (言者) 的大作中提到: 】
: 这应该是浏览器处理的事情,你不用关心
  
也就是说浏览器端的证书还是自动送出的,
服务端通过HttpContext取得HttpClientCertificate就可以。。
暂时我是这样理解的,明天去验证一下,呵呵。
  
: 不过要注意,从一个http页面发起对https页面的xhr,在ie里会被拒绝
  
是。
  
: 所以你的页面都得走https
  
目前就访问WebService就是用https的,整个虚拟目录启用ssl,
只是暂时不要求客户端证书。
  
  
☆─────────────────────────────────────☆
  
hbifts (You're beautiful, it's true) (Wed Aug 11 23:16:31 2010) 提到:
  
  
你们的WS用什么实现?IIS之上,最合适不是ASP.NET么?
  
  
【 在 i00i (烟·造爷) 的大作中提到: 】
: 多谢。:)
: 这个文章讲得比较浅,而且很奇怪即使在Web services这一段,将的仍然是
: asp.net的事情,没看出来跟WebService有什么实际关系。。
: ...................

  

☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Thu Aug 12 07:04:02 2010) 提到:
  
   是。全称大概是被称作asp.net web service,
   我所谓的asp.net其实特指webform等跟WebService无关的东东。。
    
   我的意思是那个文章实际上是在说webform上的ca、认证等内容,
   因为asp.net web service和webform的生命周期以及context不太一样,
   其中有些差异我还没有完全弄明白,所以才有那第二个问题,呵呵。:)
   asp.net怎样配置ssl,怎样申请证书,怎样处理客户端证书等是已经了解的。。
  
【 在 hbifts (You're beautiful, it's true) 的大作中提到: 】
: 你们的WS用什么实现?IIS之上,最合适不是ASP.NET么?
  
  
  
☆─────────────────────────────────────☆
  
sayinger (言者) (Thu Aug 12 09:38:32 2010) 提到:
  
其实没啥不同的,webform保持状态要么靠viewstate要么靠其自己的session,page本身还不是每次new一个出来。

  
☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Thu Aug 12 11:10:39 2010) 提到:
  
嗯。
  
至此,Session和Cache的问题已经解决了。
  
WebService.htc通过https访问WebService的问题也解决了,
唯一需要注意的是客户端(html)也必须是https连接,
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B304420 所示。
  
在要求客户端证书的情况,客户端依然会自动发送证书,
但是,当客户端存在多个与服务端匹配且合法的证书的时候,
如果是IE,会弹出窗口要求用户选择一个证书,
WebService.htc则不会这么做,“它”可能是自动选择了
一个索引最小或期限最长(有待稍后验证)的证书发送出去了。
  
如果要求用户能指定证书,该怎么做?这是我的下一个课题。
目前假想是xenroll.dll或certcli.dll提供了相应的接口,
有待调查。。。
  
不知道有没有更好的方法呢?:)
  
btw,貌似WebService.htc已经被ms抛弃了?使用和讨论的人貌似都很少。。
不知道有没有其它更好的JavaScript方案,最好是多浏览器支持的,
比如说jquery(可能下一步调查)之类,至于extjs这种大胖子暂时不能考虑。。。
  
【 在 sayinger (言者) 的大作中提到: 】
: 其实没啥不同的,webform保持状态要么靠viewstate要么靠其自己的session,page本身还不是每次new一个出来。
  
  
  
☆─────────────────────────────────────☆
  
sayinger (言者) (Thu Aug 12 12:46:38 2010) 提到:
  
WS太重了,现在的趋势是转向JSON
 

☆─────────────────────────────────────☆
  
i00i (烟·造爷) (Fri Aug 13 15:34:56 2010) 提到:
  
  
【 在 i00i (烟·造爷) 的大作中提到: 】
: 在要求客户端证书的情况,客户端依然会自动发送证书,
: 但是,当客户端存在多个与服务端匹配且合法的证书的时候,
: 如果是IE,会弹出窗口要求用户选择一个证书,
: WebService.htc则不会这么做,“它”可能是自动选择了
: 一个索引最小或期限最长(有待稍后验证)的证书发送出去了。

  
随着调查的深入,后来发现上面这段文字是错误的。特此订正。
IIS端对客户端证书的设定有三个选项,
1、无视
2、接受
3、必需
  
“无视”对于XmlHttp来说当然不存在访问时的证书问题。
“接受”的情况下,按理说,XmlHttp也不会自动发送证书(后面讨论),
但是服务器端确实接收到了一个证书(怎么被发送过来的?目前无解),
我的错误在于当初为了调试把IIS选项设置为“接收”,这样固然能收到
一个证书,但并不一定是服务器端想要的;当我把选项设置为“必需”之后,
原形毕露,XmlHttp发出的请求直接就失败了,至于原因接着讨论。
  
msdn上有一篇文章《有关 ServerXMLHTTP 的常见问题》。
http://support.microsoft.com/kb/290761
  
----------------------------------------------------------------------
里面第七项讨论提到:
   ServerXMLHTTP 是否支持 SSL 和数字证书?
  
   ServerXMLHTTP 和 XMLHTTP 组件在 MSXML3 中对 HTTPS 的支持比较有限。
   具体说就是,它们不完全支持用于身份验证的安全套接字层 (SSL) 证书。
   这些组件虽然支持 HTTPS 协议,但如果服务器要求客户端证书,请求将会失败。
  
   ServerXMLHTTP 在 MSXML 3.0 Service Pack 1 中包括了 SSL 证书支持。
----------------------------------------------------------------------
  
这里提到了XMLHTTP和ServerXMLHTTP在客户端证书处理上的区别,
WebService.htc里面利用的是XMLHTTP(Microsoft.XMLHTTP),
而ServerXMLHTTP的pid则是Msxml2.ServerXMLHTTP,
  
XMLHTTP是被宣称了不支持传送客户端正式的,
所以缺省地WebService.htc不能使用客户端证书。
  
如果强行在WebService.htc里面使用ServerXMLHTTP,证书无关的功能也可以使用,
但是依然不能传输证书,可能是因为IE安全要求的限制。
  
ServerXMLHTTP的设计初衷是作为“服务器”使用,应该没有考虑在IE里使用的情况,
所以,想调查这个问题都无从下手,找不到有用的资料了。
  
msdn里面倒是有一篇文章讨论了类似问题,但说的是IIS端的ServerXMLHTTP应用。
How to install client certificate on IIS Server for ServerXMLHTTP request object
http://support.microsoft.com/kb/301429
  
※如果强行在WebService.htc里面使用ServerXMLHTTP,还需要注意以下两个问题:
1、xml解析时会要求namespace一致,否则selectSingleNode等函数失败
2、对于目标url,其域必须加入ie的信任站点,否则访问失败
鉴于没有人会这么做,两个问题的细节在此就不细说了。。。
  
※目前的结论:使用WebService.htc(应该包括其它基于JavaScript,在浏览器
运行,使用XMLHTTP组件的所有WebService客户端),在访问要求客户端证书的
WebService时,失败,无解,方案不可行。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值