最近在研究WF,但是发现很多问题,我列下几个问题,请大神帮忙解答下:
1,我想的系统流程是去调用WCF,WCF调用工作流,但是现在发现一个问题,就是客户端调用WCF,得到的是工作流的一个方法,怎么去实例整个流程,是否WCF是不支持这样写法的?
2.关于在调用WCF,WF持久化的问题,我看官方的介绍是WorkflowApplication wfApp =
new WorkflowApplication(new Workflow1());这样去实例出来,但是客户端,调用WCF,是一个方法,所以也就出现了第一的那个问题。一直卡在这不明白。
3.关于里面说的宿主,是否在实际运用就一个监控的服务呢?
拜托各位大神给解答下,实在困扰太久,想做个简单的实例都没有办法!谢谢了
我给出一段代码:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, // 此服务只有一个实例
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class OrderService : IOrderService
{
private WorkflowRuntime workflowRuntime; // 只有一个运行时,因为 OrderService 只会被创建一次,下同
private OrderLocalService orderLocalService;
}
当你的服务无法申明为 singleton ,或者有多个服务需要访问同一个工作流时,你需要使用其它方法把工作流运行时封装成 singleton,比如使用 Unity 容器来管理工作流的唯一实例。
由于IIS通常会被设置回空闲时回收应用程序池,因此推荐使用Windows服务作为宿主环境。
WF提供默认的持久化服务实现,SqlWorkflowPersistenceService,需要先创建数据库,然后在代码或配置文件中将其示例添加到工作流运行时实例中。
例如:
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
WorkflowPersistenceService persistenceService = new .............
workflowRuntime.AddService(persistenceService);
}
你的意思就是用宿主的方法才是最佳选择吗?但是由于我现在的客户端是2.0的,WF是4.0的话,没法引用使用!有什么办法吗?
@鑫: 请分清楚客户端和服务端的区别,客户端只会通过WCF服务来访问服务端工作流暴露出来的服务方法,同运行时版本无关。唯一的问题是,.NetFramework 2.0不支持生成WCF服务的代理客户端,可以使用添加WEB引用来生成ASP.NET WebService代理客户端来解决此问题(当然,WCF服务的绑定必须限制在仅使用HTTP协议),同时也可以通过HTTP Web Reqeust来实现服务客户端(也仅支持HTTP协议)。当然,并不代表就没有问题,可能安全、事务都会限制客户端的.NetFramework的最低版本。
请你先了解下WCF后,再根据你的需求来确定你如何综合这些技术来构建你的解决方案。
工作流总是被宿主在某个进程中,在同一个进程中通过WCF(不限于只能使用WCF)的方式可以让外部进程或机器能够访问此工作流的某些方法。也就是通常说的跨进程、跨机器访问进程内对象实例。
@Launcher: 感觉你的详细解答!我现在也是挺乱的!我知道用WCF的话,是不受运行版本的影响的!我主要是要用WF,我看WF中也有使用WCF的方式,但是看了一个例子,只是调用WF的某个方法,也没法使用官方说的持久化的方式。我现在想要知道怎么做WF,怎么去持久化,用WCF跟宿主分别怎么做。请问大神你的QQ是多少,我想加你的QQ,向你学习要怎么做?感谢了
@鑫: 工作时间不能上QQ。
http://msdn.microsoft.com/zh-cn/magazine/cc164251.aspx
http://msdn.microsoft.com/zh-cn/library/dd807513.aspx
资源很多的,你可以自己学习下。
@Launcher: 好吧!那我们发邮件好吗?因为这个东西现在很急,拜托你了!
@鑫: 对不起,没时间帮你写代码,请自己看微软的示例一点点的学习。
@Launcher: 不是说写代码!我是有问题要请教,不会让你写什么代码的!因为我还是不理解里面的东西!在正式的使用中,宿主是不是服务器一直开启着?
@鑫: 是,如果不是一直开启,那么就需要持久化来保存前一个工作流实例的状态,下次启动时,才能够从存储还原。
@Launcher: 本来我就想用WCF来进行持久化的,但是发现在官方的例子中都没有说怎么在WCF中用持久化的!
@鑫: 我不太理解你的持久化是什么含义,以及用WCF来持久化的含义。WF的持久化使用 WorkflowPersistenceService 来实现,它运行在服务端,请区分服务端和客户端,WF是运行在服务端的,它提供默认的持久化实现功能,WCF只是提供客户端能够跨进程,跨机器访问服务端WF的能力。
我猜想你可能是认为WF运行在客户端,然后通过WCF把客户端的Activity写入到服务端的数据库中,这也是可以实现的,请参看自定义的 Activity 等介绍。不过我要告诉你的是,如果WF运行在客户端,那么每一个客户端就会有自己的WF,而不能共享同一个工作流程,那么就涉及到你需要在多个不同的 WF 实例之间共享状态的问题。我不确定这是否是你想要的结果,很显然你把简单的问题复杂化了。
请在此区分客户端和服务端的概念,WF运行在服务端,多个客户端可以通过 WF 代理来共享同一个工作流程,这就好比一台UNIX主机,多个客户端可以连接在上面使用相同的系统资源(CPU,磁盘等)来完成任务。
@Launcher: 我想的流程是这样,客户端-WCF-WF。我看创建项目中有个WorkflowService的项目的,里面包含了流程,我在客户端用服务引用可以调用到。我引用WCF,但是调用到的只是WF的Receive。而且我想,我点击这个的时候,新建的流程进行保存在数据库,我看例子都是用WorkflowServiceHost,WorkflowApplication,这2个都是在宿主中使用,而且带入的参数是流程,但是用WCF的NEW 是里面的方法,而没有整个流程。
@鑫: http://www.cnblogs.com/danielWise/archive/2011/03/08/1977488.html
你照着这个系列文章,一点一点的来理解吧。
@Launcher: 刚才试下了在WCF中配置,确实可以实现默认的持久化了!WCF中是调用一个一个Receive来实现下去吗?
@鑫:
http://msdn.microsoft.com/en-us/library/dd807513.aspx
http://www.cnblogs.com/zhuqil/archive/2010/04/13/DocumentApprovalProcess.html
这是微软的WF+WCF示例: DocumentApprovalProcess ,下面那个链接讲解的,你把这个例子学习会了,就基本明白了。
@Launcher: 看来得好好研究下这例子!我有运行过这例子,但是运行没什么效果,呵呵!
@鑫: 没效果是吧,那你可以让这位博主 zhuqil 给你一步一步的讲解嘛。
@Launcher:呵呵!博主好像现在都没在博客园一样!他用的那个其实是微软的,写得很繁杂。我在用那个存储扩展性的,但是PersistenceParticipant不知道在配置文件怎么配置呃!里面没有说!给出的代码是这样:static Activity workflow = CreateWorkflow();
WorkflowApplication application = new WorkflowApplication(workflow);
DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension ();
application.Extensions.Add(documentStatusExtension);你知道要怎么做吗?