我的WebService想尽量多地响应用户并发请求,但是由于后面所要查询的东西的并发量有限制,而且可能很慢,所以WebService接下的用户请求我想存入MSMQ队列里面缓存起来,慢慢处理。
这样的话,就需要WebService自己来做异步机制,就是查询成功后,还要返回给调用者数据。这个如何做到呢?
是否可以WebService将请求发送到MSMQ之后,就订阅一个事件。然后后面的主服务查询出来之后,发布这个事件,这样WebService就收到了。是否可以这样呢?有哪位高手这么做过?

解决方案 »

  1.   

    应该可行
    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconcreatingasynchronousxmlwebservicemethod.asp
      

  2.   

    在服务器新开一个线程进行工作,然后立刻返回,可以返回一个标志.
    例如
    transid=Service.StartMyWork(args);客户端需要不断查询服务的状态.
    例如
    DoOtherWork();
    bool waitfinish=true;
    bool finished=Service.FinishMyWork(transid,waitfinish,out retval);Regards .
      

  3.   

    应该考虑客户端去异步调用WShttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnservice/html/service09032002.asp
    http://www.codeproject.com/cs/webservices/async_xmlws.asp
      

  4.   

    我知道了,可以用WSE2.0中的SoapSender和SoapReceiver做。http://www.microsoft.com/china/msdn/archives/library/dnwebsrv/html/programwse2.asp#programwse2_topic4
      

  5.   

    参考http://blog.joycode.com/mvm/archive/2004/03/08/15308.aspx:用WSE 2.0在XML Web Services里面实现Callback 
    XML Web Services原先的一个问题是不能实现真正的Callback。比如用ASP.NET实现的时候,每一个[WebMethod]都是一个远程方法调用,但只支持方法效用而不支持事件(Event),不能像本地调用可以传一个Delegate来实现Callback(Callback、函数指针、Listener模式、中断等其实都是一回事,都是一种事件响应)。Web Services里面不能支持事件是很不方便的,很多应用就受限制,或者因此就放弃了Web Services技术。当然,也有一些Workaround,比如可以轮询——Outlook Web Access就是轮询的,所以能做到有email来就在屏幕右下角出一个小窗口,效果和MSN Messenger一样,这很酷;或者也可以在客户端起一个Remoting的服务器,把Remote Object的URI传给Web Services,等事件来了以后服务器再去Call客户端,这当然也是也可以。不过这些Workaround要么有些缺点(性能问题),要么不够直接(Remoting太“重”了)。这就好像你可以在JavaScript里面实现全部的OO,但这会非常非常繁琐。这又好像通过Attribute可以在.NET里面实现AOP,但总感觉不直接。WSE 2.0 (Web Services Enhancements 2.0)提供了一些TCP Messaging的功能,很好地解决了这个问题(在Web Services架构里面实现原生的Callback)。我写了一个简单的例子来演示Web Services如何支持事件回调: