WF从入门到精通(第十九章):把工作流发布为Web服务

学习完本章,你将掌握:

1.了解要把你的工作流暴露为XML Web服务来使用的话,各个工作流活动该怎样进行设计

2.了解在ASP.NET中宿主工作流需要些什么

3.看看在基于XML Web服务的工作流中如何进行错误(fault)处理

4.针对各种情况对你的基于XML Web服务的工作流进行配置

在前一章“在你的工作流中调用Web服务”中,你看到了如何从你客户端一侧的工作流中使用WF所提供的InvokeWebService活动来调用XML Web服务。但是,在那章的应用程序范例中的XML Web服务是一个典型的ASP.NET的XML Web服务——没有什么特别的。

在这最后一章中,你将学会怎样对工作流进行处理并自动地把工作流暴露为XML Web服务以让客户去使用。这并不像创建一个工作流程序集库然后从一个Web服务项目中引用它那样简单,但是话又说回来,一旦你理解了一些基本概念并在一个应用程序范例中看看它的实现后,要做到也并不困难。

备注:本章的焦点是把WF作为XML Web服务集成到ASP.NET中使用。但是,在暴露XML Web服务的时候你应该意识到许多关键的问题,最大的问题是安全。对安全的充分讨论远远超过了我可以在此做的介绍,但是下面这个链接应该可以为你带来帮助:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCH12.asp。假如你想把你的工作流暴露为一个XML Web服务的话,我强烈建议你查阅一下ASP.NET安全方面的最佳实践,尤其是围绕XML Web服务的实践。

把工作流暴露为一个XML Web服务

你不能在ASP.NET环境中直接执行工作流的部分原因其实在本书中你已经了解过,默认情况下,工作流运行时是以异步的方式去执行工作流实例的。事实上,在非Web应用程序中使用工作流的时候,这是一个很重要的特性。

但是在基于Web的环境下,这会带来一个问题。如果一个ASP.NET请求发来后,不管它是一个XML Web服务还是一个ASP.NET Web页面,工作流实例都要开始执行并且运行时要把控制权返回给ASP.NET。你的XML Web服务或者ASP.NET页面会立即并持续执行准备输出并可能会在工作流实例完成之前结束。因为工作流实例是异步的,它和你的ASP.NET应用程序并行执行,因此你的ASP.NET代码可能会很快地完成并返回一个工作流处理过程并未完成的响应结果。

提示:在ASP.NET Web页面中正确地执行工作流实例实际上就是对ASP.NET异步Web页面进行调用,该话题超出了本书的范围。但是下面这个链接能带给你一些具体的细节:http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/。

这个问题至少会给我们带来两个挑战。首先,我们需要禁用,或者至少要对我们的工作流的异步执行方式进行变通。我们需要它们以同步的方式执行,就像它们和我们的页面或者XML Web服务中使用的是同一个线程一样,以让该Web应用程序在我们结束之前是不会把响应结果返回给调用者的。当然,这并未解决长时间运行的工作流的问题,这是我们将需要去克服的第二个挑战性难题。

长时间运行的工作流所带来的难题紧紧地和基于Web的应用程序自身的性质联系在一起。在这最后一章中你知道了Web应用程序从本质上是无状态的。所发送的在数毫秒间就断开的请求是完全意识不到对方的,除非我们创建一个框架来提供这种能力。Web应用程序也在Web服务器上执行,它通常是非常昂贵的系统,旨在为许许多多的客户端提供服务。假如一个工作流要花费大量时间才能完成,那么它会完全占有Web服务器并降低应用程序的可伸缩性(指的是为越来越多的客户端请求提供服务的能力)。

解决的办法是进行状态管理以及对长时间运行的工作流进行持久化。假如你的工作流程要在超过一个以上的基于Web的调用(ASP.NET页面请求或者XML Web服务)后才能完成的话,你必须持久化该工作流实例并在下一个执行周期期间重新加载它。这也是为什么我在前一章中的“长时间运行的XML Web服务”一节中提到重新生成保存了session状态的cookie的原因。因为客户端也必须意识到有这种可能性并考虑到会有超过一个以上的请求-响应的情况。

Internet信息服务(IIS)特别擅于节约系统资源。在一个典型的客户端应用程序中,其实在本书中到目前为止你所看到过的每一个应用程序当中,工作流运行时是在应用程序开始执行的时候被启动并贯穿该应用程序的生命周期。然而,IIS要收回服务器的资源。我们作为ASP.NET的程序员,这就意味着下面的两件事。

首先,我们必须以某种方式来决定在什么地方以及怎样来启动工作流运行时。在同一个ASP.NET应用程序中的不同请求会被放到不同的线程上进行处理,但是它们在同一个应用程序域(AppDomain)中执行。就像你或许还记得的,在每一个AppDomain只能有唯一的一个WF工作流运行时的实例在执行。因此它并不像在你的ASP.NET应用程序每收到一个请求的时候就创建一个工作流运行时的实例那样简单。这样做可能会导致工作流运行时产生异常。

其次,我们需要找到一种方法来让我们的工作流以同步的方式执行。或者,如果我们的工作流需要长时间运行的话,我们必须在开始执行工作流实例的时候、停止执行的时候、持久化工作流实例的时候以及把工作流当前的状态返回给客户端的时候进行同步。为此,我们需要替换默认的工作流运行时的线程调度服务。要替换该线程调度服务,我们需要重新配置工作流运行时。

时间: 2024-10-31 15:52:28

WF从入门到精通(第十九章):把工作流发布为Web服务的相关文章

WF从入门到精通(第六章):加载和卸载实例

学习完本章,你将掌握: 1.理解工作流实例为什么要卸载和重新加载及其时机 2.理解工作流实例为什么要持久化及其时机 3.搭建SQL Server 2005,使其为WF和工作流持久化提供支持 4.使用SqlWorkflowPersistenceService服务 5.在你的工作流代码中进行实例的加载和卸载 6.使持久化服务能自动地加载工作流实例及卸载空闲中的工作流实例 假如你花点时间真正考虑该怎样使用WF和工作流在你的应用程序中进行处理的话,你或许想像的许多解决方案中都包含那些需长时间运行的处理过

WF从入门到精通(第十七章):关联及本地主机通信(上)

学习完本章,你将掌握: 1.了解工作流关联(correlation)以及在什么地方必须去使用它.它为什么是重要的 2.使用工作流关联参数(correlation parameters) 3.生成并使用相关的本地通信服务 贯穿本书你看过的应用程序普遍都是基于单一相同架构的,通过WF的支持在工作流实例中执行任务.这些都是在应用程序和它的工作流实例间进行一对一的通信.假如你和一个工作流实例进行通信,你这样做保证了无论以任何方式在应用程序和工作流之间传送数据都不会被混淆.一个应用程序对应一个工作流. 但

WF从入门到精通(第十三章):打造自定义活动(一)

学习完本章,你将掌握: 1.了解对于创建一个功能齐全的自定义工作流活动来说哪些组件是必须的 2.创建基本的自定义工作流活动 3.在基本的自定义工作流活动中应用验证规则 4.把基本的自定义工作流活动集成到Microsoft Visual Studio的工作流视图设计器和工具箱中 WF并不可能涵盖到你可能在你的工作流中想要实现的各个方方面面.即使WF对于开发社区来说仍是非常新的技术,但目前已经可以获得许多免费发布的自定义活动,可以肯定商业级的活动最终也会跟进. 在这章中,你将通过创建一个新的工作流活

Scala入门到精通——第十九节 隐式转换与隐式参数(二)

作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自动帮我们搜索相应的隐式值,并将该隐式值作为函数的参数,这里面其实没有涉及到隐式转换,本节将演示如何利用隐式参数进行隐式转换,下面的代码给定的是一个普通的比较函数: object ImplicitP

Scala入门到精通——第二十九节 Scala数据库编程

本节主要内容 Scala Maven工程的创建 Scala JDBC方式访问MySQL Slick简介 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程上修改而来的,官方给的例子是H2数据库上的,经过本人改造,用在MySQL数据库上,官方教程地址:http://slick.typesafe.com/doc/2.1.0/sql-to-slick.html 1. Scala Maven工程的创建 本节的工程项目采用的是Maven Project,在POM.xml文件

WF从入门到精通(第十一章):并行活动

学习完本章,你将掌握: 1.理解在工作流环境中Parallel活动是怎样执行的,并且懂得如何使用它们 2.并行执行路径中的同步数据存取和临界代码区 3.使用ConditionedActivityGroup活动去执行根据条件表达式判断执行路径的并行活动 在本书中截止目前为止,我们仅仅处理过顺序业务流程.如活动A执行后转到活动B的执行等等.我们还没看到过并行执行路径和由此通常伴随而来的错综复杂的情况.在本章中,我们将看看并行活动的处理过程,以及看看怎样对横跨并行执行路径的共享信息进行同步存取. 使用

WF从入门到精通(第五章):workflow跟踪

学习完本章,你将掌握: 1.workflow的可选服务 2.创建一个事件跟踪数据库 3.激活事件跟踪服务 4.创建一个自定义跟踪 5.查看你的workflow的跟踪信息 目前为止,我们看过workflow的一些基本对象.我们通过活动创建workflow任务,它们在执行时由WorkflowInstance对象进行管理.workflow实例由WorkflowRuntime编入队列并进行控制.但WF不只是为我们提供了这些对象,它也为我们提供了一些服务来和这些对象一起协同工作. 可插拔(可选)服务 工作

WF从入门到精通(第四章):活动及workflow类型介绍

学习完本章,你将掌握: 1.workflow活动是怎样形成的 2.顺序工作流和状态机工作流之间的区别 3.创建一个顺序工作流 4.创建一个状态机工作流 活动是WF中workflow处理的基本单位,假如你再把一个业务处理过程(或workflow任务)进行分解,你会发现它由更小.更细的任务组成.假如需设计这样一个大的任务,它需把信息送到一系列的数据处理系统进行处理,那么子任务或许就包括这样一些事情:从数据库读取数据,使用这些数据生成一个文件,通过使用FTP或XML Web service把文件传到一

WF从入门到精通(第三章):workflow实例

学习完本章,你将掌握: 1.使用不带参数和带参数二种方式初始化一个workflow实例 2.测定你运行中的workflow实例的状况 3.停止workflow实例 4.确定你的workflow空闲或终止的原因 一个workflow实例由一个或多个活动组成.(我们将在第七章开始介绍各种活动:"Basic Activity Operations.")"primary activity"或者"root activity"被称作"workflo