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

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7450

WKWebView _WebFilterIsActive returning: NO

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

weixin_30362801的博客 4634

从放弃到再入门之拉格朗日对偶问题推导

普通同学的解法 无约束条件:求导就可以了 等式约束:代入消元,再求导 不等式约束:分情况讨论(在边界上和不在边界上),分别对应1,2的情况 然而发现,有些情况消元特别复杂,甚至不能求解 聪明同学的解法 发现:在最优点的情况下,约束曲面的法向量和目标函数的梯度反向必相同或相反 拉格朗日乘子法如何理解? (在2维里可以形象的解释为z=f(x,y)在约束条件g(x,y)=c中,极值...

qq_34564612的博客 1万+

具身智能落地实战:制造业、物流与电力的工业级方案设计

具身智能是一种融合感知、推理与物理执行的智能范式,其核心在于构建具备因果建模能力、多模态闭环反馈和实时动作规划的行动主体。区别于通用AI或传统自动化,它依托多模态大模型、高精度力觉/触觉传感及Sim2Real仿真技术,实现对真实物理环境的深度理解与自适应交互。技术价值体现在可解释性决策、毫秒级跨模态协同与零停机容错能力,已规模化应用于制造业质检、物流破损鉴定、电力绝缘子巡检等强约束工业场景。本文聚焦‘行业应用方案解决方案’这一高频搜索需求,系统拆解从工位筛选、分层架构设计到72小时现场交付的全链路工程方法论

weixin_30952479的博客 300

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

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

Sooober的博客 3万+

Unity 数字孪生笔记1 工具介绍

前言 工欲善其事必先利其器 流程思考 数字孪生本质上一种基于实际物理数据的可视化方案,通过对接实际数据,在三维界面中展示孪生结果。 那么这个流程就很简单了。 整个流程分为三块:数据来源-》数据分析-》数据展示 输入数据 首先我们需要考虑我们能拿到什么。第一,实际物体的三维数据从哪里来,第二,实际数据怎么获取到。 模型数据 工业上常常会用到CAD模型,CAD模型具有精确、统一的特点,但是CAD不是三角面片,我们不能直接导出到Unity中,而且导入之后有很多不合理的地方,例如面片杂乱、面数过高等问题。针对这个

Thissky的专栏 1万+

Xcode 9使用时那些坑

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

ProgrammerWorking的博客 3429

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

官网:www.SZLCSC.COM以芯片为例器件类——>芯片类——>对应芯片确定芯片——>数据手册1:原理图2:PCB3:打开操作流程选中原理图——>文件——>导出——>AD1: ✔2:导出AD文件操作流程选中PCB图——>文件——>导出——>AD1: ✔2:导出AD文件1:PCB图2:原理图操作流程文件——>打开操作流程选中文件——>打开操作流程项目文件——>添加新的...到工程——>Schematic Library新原理图库操作流程项目文件——>添加新的...到工程——>PCB Library新的PC

XU157303764的博客 5437

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 298

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

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

iOS技术分享与学习博客 4339

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1506

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

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

chenqunan3231的博客 106

把收款差异从扯皮变成闭环:SAP S/4HANA Dispute Resolution 模块到底解决什么问题?

本文摘要: SAP S/4HANA的争议解决模块(Dispute Resolution)通过标准化流程管理企业应收争议,解决发票与收款差异问题。核心是创建可追踪的Dispute Case工单,明确处理角色(Processor和Manager),并与财务系统联动实现自动清账。系统支持手工/自动创建争议工单,通过动态默认值减少错误,并最终实现争议金额归零的闭环管理。文中给出制造业客户扣款的完整处理案例,并强调组织落地需统一权限与目录。最后提供ABAP代码示例展示如何通过BAPI创建争议工单。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 167

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

weixin_36084686的博客 201

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

风尘浪子 9876

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

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

产线物联网项目技术选型:为什么我弃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、付费专栏及课程。

余额充值