WF与WebService交互
WF中提供了WebServiceInputActivity,WebServiceOutputActivity,InvokeWebServiceActivity,WebServiceFaultActivity四个活动来完成与Webservice
的交互,下面简要介绍下这四个活动:
1.WebServiceInputActivity活动:使工作流能够从 Web 服务接收数据。 在启动 Web 服务时将自身作为 Web 服务方法发布,然后在随后调用 Web 服务
方法时接收数据。
2.WebServiceOutputActivity活动:用于响应对工作流所做的 Web 服务请求,该活动必须与WebServiceInputActivity 活动关联。
3.WebServiceFaultActivity活动:为所出现的 Web 服务错误建立模型。
4.InvokeWebServiceActivity活动:通过代理类调用 Web 服务,并传递和接收指定的参数。
应用举例
1.下面我们举例说明,由于WebServiceInputActivity活动所接收的方法必须定义在接口中,所以我们先建立一个接口IAddService ,代码如下:
namespace CaryWFLib { interface IAddService { double Add(double number1, double number2); } }
2.工作流设计器如下图:
3.在工作流设计器中我们首先拖入了一个WebServiceInputActivity活动,设置其InterfaceType属性,然后MethodName,然后将IsActivating设为true,
默认为false,当选了MethodName属性后属性窗口会自动多出参数的属性。在CodeActivity活动中完成加法运算逻辑,最后是WebServiceOutputActivity
活动,工作流的代码如下:
public sealed partial class AddWorkflow: SequentialWorkflowActivity { public double number1; public double number2; public double result;
public AddWorkflow() { InitializeComponent(); } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { result = number1 + number2; } }
4.这个时候你就可以用项目的右键菜单里的"作为Web服务发布"来将工作流发布为WebService,发布完成后会在当前的解决方案里多出一个WebService
的项目,我们就可以运行测试了,如下图:
只有工作流库才可以发布为WebService,新生成的WebService项目会包含一个CaryWFLib.AddWorkflow_WebService.asmx文件和一个Web.config
配置文件,web.config文件的内容如下:
<?xml version="1.0"?> <configuration> <configSections> <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </configSections> <WorkflowRuntime Name="CaryWFLib"> <CommonParameters> <add name="ConnectionString" value="Initial Catalog=WorkflowPersistence;Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;" /> </CommonParameters> <Services> <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
UnloadOnIdle="true"/> </Services> </WorkflowRuntime> <appSettings/> <connectionStrings/> <system.web> <compilation debug="false"/> <authentication mode="Windows"/> <httpModules> <add type="System.Workflow.Runtime.Hosting.WorkflowWebHostingModule, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="WorkflowHost"/> </httpModules> </system.web> </configuration> web.config中的SqlWorkflowPersistenceService是我们手动添加的,其他的都是自动生成的。
5.我们第一次调用WebService是正常的,如果你再次调用就会出现下错误:
System.InvalidOperationException: 在状态持久性存储中找不到 ID 为“21cf8af3-885d-47dd-acbc-530eeba794ed”的工作流。
这是由于在web.config中使用了WorkflowWebHostingModule,我们第二次调用的时候WebService会去装载之前的工作流实例,而第一次调用完成后该实
例就销毁了,如果你关掉浏览器在打开就又正常了,这是因为新的工作流实例又产生了。
WorkflowWebHostingModule
1.WorkflowWebHostingModule类是默认的路由机制,用于通过使用ASP.NET cookie将web服务请求路由到相应的工作流,发出这些请求的客户端要支持
cookie。这个主要目的是为了可以多次的调用一个工作流实例的方法。我们从新设计一个工作流用于解决上面的问题,将原接口扩展一下,代码如下:
namespace CaryWFLib { interface IAddStatefulService { void StartWorkflow(); double Add(double number1, double number2); void StopWorkflow(); } }
2.工作流设计如下:
我们使用ListenActivity来监听,WebServiceInputActivity1绑定StartWorkflow方法,WebServiceInputActivity2绑定Add方法,WebServiceInputActivity3
绑定StopWorkflow方法,如果调用StopWorkflow方法,我们就在WebServiceInputActivity3的调用完成的事件中将While的条件设为false。我们在web.config
中装载了持久化服务,所以在工作流Idle的时候就进行持久化的存储,当第二次调用的时候会根据cookie中保存的工作流实例id从持久化数据库中装载相同的
工作流实例。
3.如果在其他程序中,比如winform中,我们需要手动装载持久化中的工作流实例,那我们如何知道工作流实例的id呢,我们reflector一下WorkflowWebHostingModule的代码如下:
public sealed class WorkflowWebHostingModule : IHttpModule { // Fields private HttpApplication currentApplication; // Methods public WorkflowWebHostingModule() { WorkflowTrace.Host.TraceEvent(8, 0, "Workflow Web Hosting Module Created"); } private void OnAcquireRequestState(object sender, EventArgs e) { WorkflowTrace.Host.TraceEvent(8, 0, "WebHost Module Routing Begin"); HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("WF_WorkflowInstanceId"); if (cookie != null) { HttpContext.Current.Items.Add("__WorkflowInstanceId__", new Guid(cookie.Value)); } } private void OnReleaseRequestState(object sender, EventArgs e) { if (HttpContext.Current.Request.Cookies.Get("WF_WorkflowInstanceId") == null) { HttpCookie cookie = new HttpCookie("WF_WorkflowInstanceId"); object obj2 = HttpContext.Current.Items["__WorkflowInstanceId__"]; if (obj2 != null) { cookie.Value = obj2.ToString(); HttpContext.Current.Response.Cookies.Add(cookie); } } } void IHttpModule.Dispose() { } void IHttpModule.Init(HttpApplication application) { WorkflowTrace.Host.TraceEvent(8, 0, "Workflow Web Hosting Module Initialized"); this.currentApplication = application; application.ReleaseRequestState += new EventHandler(this.OnReleaseRequestState); application.AcquireRequestState += new EventHandler(this.OnAcquireRequestState); } } 4.从reflector出的源代码我们可以发现,工作流实例的id存储在名称为WF_WorkflowInstanceId的cookie中,Item为__WorkflowInstanceId__。
我们通过如下代码就可以得到工作流实例的id了,如下:
localhost.AddWorkflow_WebService ws = new localhost.AddWorkflow_WebService(); ws.CookieContainer = new System.Net.CookieContainer(); ws.Url = "http://localhost:6411/CaryWFLib_WebService1/CaryWFLib.AddWorkflow_WebService.asmx"; ws.Add(1, 2); Uri uri = new Uri(ws.Url); CookieCollection cc = ws.CookieContainer.GetCookies(uri); foreach (Cookie c in cc) { if (c.Name == "WF_WorkflowInstanceId") { this.Label3.Text = c.Value; } }
5.由于WorkflowWebHostingModule必须要求客户端启用cookie,当不能在客户端中启用 Cookie 时我们可以从新写一个WorkflowWebHostingModule。
6.上面的发布WebService是使用WF本身提供功能,我们完全可以自己来实现,代码如下:
namespace CaryWFLib { [WebService(Namespace = "http://CaryWFLibWebService.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class CaryWFLibWebService:System.Web.Services.WebService { private static WorkflowRuntime workflowRuntime = new WorkflowRuntime(); [WebMethod] public double Add(double number1,double number2) { double result=0; AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { result =Convert.ToDouble( e.OutputParameters["result"]); waitHandle.Set(); }; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { waitHandle.Set(); }; Dictionary<string, object> wfParas = new Dictionary<string, object>(); wfParas.Add("number1", number1); wfParas.Add("number2", number2); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(ManualAddWorkflow),wfParas); instance.Start(); waitHandle.WaitOne(); return result; } } }
当然这个时候,ManualAddWorkflow工作流的设计就只需要一个CodeActivity来完成加法的逻辑就可以了,WebServiceInputActivity等这些活动就不需要了。
发表评论
-
平淡的2007
2007-12-24 08:04 813早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1410今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 887[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 633[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 781[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1141[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 918当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 834Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 841在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 692我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1176MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 701本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 828本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 753WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1054由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 792[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 686[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 729[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1098一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 943首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
入门,使用asix2开发的webservice实例,部署后直接输入:http://localhost:8080/webServe/services/HelloWorld?wsdl,端口号根据自己的定,文章地址如下,可以去参考下:...
然而,需要注意的是,随着WCF、WF、WPF等技术的出现,以及现在更流行的RESTful API,ASMX类型的WebService在现代开发中的使用已经逐渐减少。不过,对于维护旧项目或理解.NET早期Web服务开发的人来说,这类工具仍然是...
WF-IoT 采用了多种安全技术策略来确保其安全性,包括轻量级加解密技术的应用、终端设备的安全加固策略、终端设备与网关的通信安全策略、具体业务的机制安全策略、整体的安全防护策略等。 轻量级加解密技术的应用 WF...
本文档是对C#高级程序员面试题的总结,涵盖了.NET Framework、ASP.NET、AJAX、WebService、SOA、SaaS、WCF、WF、WPF等多个方面的技术知识点。 .NET Framework 1. .NET 编译过程:在.NET Framework中,编译过程主要...
5. **工作流服务(Workflow Services)**:结合WF与WCF(Windows Communication Foundation),允许创建基于服务的工作流,能够跨网络通信。 6. **状态机工作流(State Machine Workflow)**:一种特殊的工作流类型...
Actionsoft_Casestudy-刘金柱.pdf BEA-793.pdf Certification_Details_GCP8-CiWD.pdf IBM MessageBroker笔记系列(一).doc juddi-0.9rc4.zip ORACLE CLOUD解决方案.rar ...基于SOA的业务流程管理(BPM)和工作流(WF).pdf
Web Service可以与WCF(Windows Communication Foundation)、WF(Windows Workflow Foundation)等微软技术结合,实现更复杂的服务交互和工作流。 九、Web API与Web Service 随着Web的发展,.NET框架也推出了Web ...
WF资料 ├─Activity │ │ 1_Activity 类.doc │ │ 2_状态机与顺序工作流的继承结构.doc │ │ 3_顺序工作流容器 SequentialWorkflowActivity .doc │ │ EventDriven绑定容器 ...
11. Windows Workflow Foundation(WF):WF是一个工作流引擎,它使开发人员能够设计、执行和管理工作流。 12. Windows CardSpace和CardSpace:Windows CardSpace是.NET Framework的一个组件,用于安全地管理用户...
<s:TextInput id="txtName" text="wf_admin" x="196" y="66"/> 查询" click="ws.GetTableXml.send()"/> ``` 在这段代码中,我们首先定义了一个Web Service实例,并指定了它的WSDL地址。接着,通过`<mx:operation>...
这部分内容会解释AJAX的基本原理,如何使用UpdatePanel、ScriptManager和WebService来实现无刷新更新,以及自定义AJAX控件的开发。 文件名中提到的“5-8”、“17-20”等章节,可能分别覆盖了Web应用程序的流程控制...
从功能的角度来看,WCF完全可以看作是ASMX,.Net Remoting,Enterprise Service,WebService,MSMQ等技术的并集。 WPF是Windows Presentation Foundation,微软新发布的Vista操作系统的三大核心开发库之一,其主要...
com.kingdee.bos.service.webservice.tools com.kingdee.bos.sql com.kingdee.bos.sql.dialect.oracle com.kingdee.bos.sql.dom com.kingdee.bos.sql.dom.expr com.kingdee.bos.sql.dom.stmt ...
### C++ SOAPToolkit 开发 WebService 客户端详解 #### 概述 在现代软件开发中,Web Services 是一种非常重要的技术,它允许不同应用程序之间通过网络进行通信。SOAP(Simple Object Access Protocol)作为 Web ...