WF与WebService

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.工作流设计器如下图:

wfws1

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.工作流设计如下:

wfws3

我们使用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等这些活动就不需要了。

WF工作流技术内幕 —— 通过Web服务调用Workflow工作流 在开发一个企业ERP系统时,其业务流程是开发的关键,系统往往会将开发好的业务方案发布为Web服务以供外界调用。客户可以通过服务器,互联网等等方式 去调用服务,而解决业务上需要及信息的交换问题。有见及此,微软在.NET 3.0基础上发布了WF,WCF,以及WCS,WPF(为开发表现层而设)。WF,WCF正是解决企业核心问题的关键,通过WF可以轻松地轻松地按照业务 逻辑去实现开发,然后凭借WCF的强大 阅读详情

相关推荐

web wf 设计器

web wf 设计器web wf 设计器web wf 设计器web wf 设计器web wf 设计器

WF _WebFilterIsActive returning NO并且Can't Add Self as Subview 崩溃解决办

错误提示如下: WF: _userSettingsForUser mobile: { filterBlacklist = ( ); filterWhitelist = ( ); restrictWeb = 1; useContentFilter = 0; useContentFilterOverrides = 0; whitelistEnabled = 0; } WF: _We...

weixin_34292402的博客 878

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 420

WKWebView _WebFilterIsActive returning: NO

写这篇文是因为在UIWebView加载页面的时候有时候会返回: filterBlacklist = ( ); filterWhitelist = ( ); restrictWeb = 1; useContentFilter = 0; useContentFilterOverrides = 0; whitel...

weixin_30362801的博客 4634

保姆级教程:用BIGEMAP和Global Mapper搞定5米精度DEM高程数据下载与处理

本文提供了一份详细的5米精度DEM高程数据处理教程,涵盖从BIGEMAP下载到Global Mapper处理的完整流程。通过实战案例和避坑指南,帮助用户掌握高效下载DEM数据、优化等高线生成及坐标系转换的关键技巧,适用于GIS新手和专业人士。

weixin_34169322的博客 391

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

iOS10下在UIWebView加载的页面, WF: _WebFilterIsActive returning: NO

UIWebView加载的网址链接是我们后台做的一个pdf文件转H5的链接, 测试发现在iOS9系统上可以正常加载网页内容, 但是很奇怪到iOS10系统上就无法加载, 会出现以下Log信息, WF: _userSettingsForUser mobile: {     filterBlacklist =     (     );     filterWhitelist =     (   

Sooober的博客 3万+

【前端圭臬】二:你知道的和不知道的 HTML

关于 HTML,说几个你可能不太关注的问题。

Evan 的博客 4758

Xcode 9使用时那些坑

我目前使用Xcode9发现一些奇怪的坑,坑的不要不要的。。。。。1.本地图片怎么也不显示(新拖入的图片),如果之前的用xcode8开发的项目拖入的图片再用xcode9打开没有影响,但是在Xcode9新拖入的图片怎么也不显示。 这样就是显示不出来. 解决办法是:在图中部分手动再次添加一次 2.网络图片在浏览器可以显示出来,但是在app中怎么显示不出来(图片http://),有人可能会说,你肯

ProgrammerWorking的博客 3429

在 SAP 资产模块跨 2024 和 2025 两个年度操作后,运行 AFAB 测试无数据,大概率是折旧已完全过账、跨期配置异常或资产数据异常等原因

SAP资产模块跨年度操作AFAB测试无数据的排查方案:首先检查折旧是否已完全计提,确认资产主数据价值;其次验证跨年度配置是否合规,包括全局配置、折旧范围和账期状态;然后重新执行AFAR折旧计算刷新数据;排查资产主数据异常或业务操作冲突;最后核对AFAB运行参数是否正确设置,包括会计年度、期间范围和运行模式等。

金牌架构师 866

IsaacSim环境配置之配置本地资产包

摘要:Isaac Sim官方资产文件默认从美国服务器下载速度慢,影响开发体验。建议下载本地资产包并配置本地资源源。具体步骤包括:1) 下载资产包并解压;2) 修改Isaac Sim安装路径下的配置文件,添加本地资产路径配置,包括机器人、人物、环境等各类资源目录。配置完成后可显著提升资产加载速度,改善开发效率。文中提供了详细的配置文件修改示例和截图说明。

拥抱具身智能,昇腾Ascend C 330

iOS10下UIWebView加载页面时出现log求解

WF: _userSettingsForUser mobile: {     filterBlacklist =     (     );     filterWhitelist =     (     );     restrictWeb = 1;     useContentFilter = 0;     useContentFilterOverrid

iOS技术分享与学习博客 4339

杰理SDK入门教程(五):按键使用配置

摘要 杰理SDK提供IO按键和AD按键两种方案。IO按键通过GPIO电平检测实现,配置时需要设置板级宏定义和硬件连接,默认使用PB1引脚。AD按键基于ADC电压采样,通过电阻分压区分按键,需配置功能使能、硬件通道和键值适配。按键功能通过修改SDK中的key_table文件实现。两种方案适用于不同硬件场景,开发者可根据需求选择。

qq_42014563的博客 777

WF4.0实战(二十四):WF4定制个性化的WebService

概述: 用WF也可以处理网站的业务逻辑,有一个非常好的开源项目:Dropthings,它就是用WF去处理网站的业务逻辑的。这篇文章中,我也将实现一个站点,这个站点使用WF4去处理复杂的业务逻辑。 首先说明一下这个程序的主要功能。日常生活中,我们会大量的使用webservic...

chenqunan3231的博客 106

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4500

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

wf工作流java_WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(基础实例)...

在开发一个企业ERP系统时,其业务流程是开发的关键,系统往往会将开发好的业务方案发布为Web服务以供外界调用。客户可以通过服务器,互联网等等方式 去调用服务,而解决业务上需要及信息的交换问题。有见及此,微软在.NET 3.0基础上发布了WF,WCF,以及WCS,WPF(为开发表现层而设)。WF,WCF正是解决企业核心问题的关键,通过WF可以轻松地轻松地按照业务 逻辑去实现开发,然后凭借WCF的强大...

weixin_36084686的博客 201

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WF工作流技术内幕 —— 通过Web服务调用Workflow工作流(基础实例)

在开发一个企业ERP系统时,其业务流程是开发的关键,系统往往会将开发好的业务方案发布为Web服务以供外界调用。客户可以通过服务器,互联网等等方式去调用服务,而解决业务上需要及信息的交换问题。有见及此,微软在.NET 3.0基础上发布了WF,WCF,以及WCS,WPF(为开发表现层而设)。WF,WCF正是解决企业核心问题的关键,通过WF可以轻松地轻松地按照业务逻辑去实现开发,然后凭借WCF的强大功能把同一服务绑定多个不同的EndPoint,这样客户端与服务与服务器端通讯就不会再受开发语言的影响。

风尘浪子 9876

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

产线物联网项目技术选型:为什么我弃Java选.NET?

在工业物联网与产线数据采集场景中,技术选型的关键往往不在于框架的先进性,而在于能否匹配客户现场的运维现实。Java技术栈凭借Spring Boot等生态在互联网后端占据主流,但面对以Windows Server为主、运维能力有限的中小工厂,其默认的部署形态和维护门槛反成负担。.NET凭借与Windows生态的原生契合、Windows服务的自愈能力以及图形化运维体验,在保障数据采集实时性与系统稳定性的同时,大幅降低了客户侧的操作难度。从设备联网看板到历史数据归档,合理的技术选型能有效规避因运维黑盒导致的信任危

weixin_33858336的博客 408

WWF Web service

 WF 和Web Service 的关联主要是两种场景:其一,WF可以调用一个Web Service;其二是,你可以将一个WF 发布成一个Web Service在WF中使用/调用Web Services 是非常容易的,如果你使用过Visual Studio开发Web Service和调用过Web Service,那么在WF中调用一个Web Service也几乎是相同的。基本上是通过.NET Fra

DillonHunter的专栏 1863

WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(基础实例)...

在开发一个企业ERP系统时,其业务流程是开发的关键,系统往往会将开发好的业务方案发布为Web服务以供外界调用。客户可以通过服务器,互联网等等方式 去调用服务,而解决业务上需要及信息的交换问题。有见及此,微软在.NET 3.0基础上发布了WF,WCF,以及WCS,WPF(为开发表现层而设)。WF,WCF正是解决企业核心问题的关键,通过WF可以轻松地轻松地按照业务 逻辑去实现开发,然后凭借WCF的强大...

weixin_30699235的博客 99
上一篇: MOSS程序中如何发Mail?
下一篇: 获得" 微软最有影响力开发者"称号
fdqwfdsafdsa
博客等级 码龄18年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值