首页 新闻 搜索 专区 学院

关于WCF WF的问题,求大神指教

0
悬赏园豆:5 [已解决问题] 解决于 2015-09-17 14:59

最近在研究WF,但是发现很多问题,我列下几个问题,请大神帮忙解答下:

1,我想的系统流程是去调用WCF,WCF调用工作流,但是现在发现一个问题,就是客户端调用WCF,得到的是工作流的一个方法,怎么去实例整个流程,是否WCF是不支持这样写法的?

2.关于在调用WCF,WF持久化的问题,我看官方的介绍是WorkflowApplication wfApp =
    new WorkflowApplication(new Workflow1());这样去实例出来,但是客户端,调用WCF,是一个方法,所以也就出现了第一的那个问题。一直卡在这不明白。

3.关于里面说的宿主,是否在实际运用就一个监控的服务呢?

拜托各位大神给解答下,实在困扰太久,想做个简单的实例都没有办法!谢谢了

鑫的主页 | 初学一级 | 园豆:2
提问于:2012-12-17 14:36
< >
分享
最佳答案
0

我给出一段代码:

[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);

}

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2012-12-17 15:01

你的意思就是用宿主的方法才是最佳选择吗?但是由于我现在的客户端是2.0的,WF是4.0的话,没法引用使用!有什么办法吗?

| 园豆:2 (初学一级) | 2012-12-17 15:04

@鑫: 请分清楚客户端和服务端的区别,客户端只会通过WCF服务来访问服务端工作流暴露出来的服务方法,同运行时版本无关。唯一的问题是,.NetFramework 2.0不支持生成WCF服务的代理客户端,可以使用添加WEB引用来生成ASP.NET WebService代理客户端来解决此问题(当然,WCF服务的绑定必须限制在仅使用HTTP协议),同时也可以通过HTTP Web Reqeust来实现服务客户端(也仅支持HTTP协议)。当然,并不代表就没有问题,可能安全、事务都会限制客户端的.NetFramework的最低版本。

请你先了解下WCF后,再根据你的需求来确定你如何综合这些技术来构建你的解决方案。

工作流总是被宿主在某个进程中,在同一个进程中通过WCF(不限于只能使用WCF)的方式可以让外部进程或机器能够访问此工作流的某些方法。也就是通常说的跨进程、跨机器访问进程内对象实例。

Launcher | 园豆:45045 (高人七级) | 2012-12-17 15:15

@Launcher: 感觉你的详细解答!我现在也是挺乱的!我知道用WCF的话,是不受运行版本的影响的!我主要是要用WF,我看WF中也有使用WCF的方式,但是看了一个例子,只是调用WF的某个方法,也没法使用官方说的持久化的方式。我现在想要知道怎么做WF,怎么去持久化,用WCF跟宿主分别怎么做。请问大神你的QQ是多少,我想加你的QQ,向你学习要怎么做?感谢了

| 园豆:2 (初学一级) | 2012-12-17 15:49

@鑫: 工作时间不能上QQ。

http://msdn.microsoft.com/zh-cn/magazine/cc164251.aspx

http://msdn.microsoft.com/zh-cn/library/dd807513.aspx

资源很多的,你可以自己学习下。

Launcher | 园豆:45045 (高人七级) | 2012-12-17 16:01

@Launcher: 好吧!那我们发邮件好吗?因为这个东西现在很急,拜托你了!

| 园豆:2 (初学一级) | 2012-12-17 16:36

@鑫: 对不起,没时间帮你写代码,请自己看微软的示例一点点的学习。

Launcher | 园豆:45045 (高人七级) | 2012-12-17 16:39

@Launcher: 不是说写代码!我是有问题要请教,不会让你写什么代码的!因为我还是不理解里面的东西!在正式的使用中,宿主是不是服务器一直开启着?

| 园豆:2 (初学一级) | 2012-12-17 16:52

@鑫: 是,如果不是一直开启,那么就需要持久化来保存前一个工作流实例的状态,下次启动时,才能够从存储还原。

Launcher | 园豆:45045 (高人七级) | 2012-12-17 16:54

@Launcher: 本来我就想用WCF来进行持久化的,但是发现在官方的例子中都没有说怎么在WCF中用持久化的!

| 园豆:2 (初学一级) | 2012-12-18 10:12

@鑫: 我不太理解你的持久化是什么含义,以及用WCF来持久化的含义。WF的持久化使用 WorkflowPersistenceService 来实现,它运行在服务端,请区分服务端和客户端,WF是运行在服务端的,它提供默认的持久化实现功能,WCF只是提供客户端能够跨进程,跨机器访问服务端WF的能力。

 

我猜想你可能是认为WF运行在客户端,然后通过WCF把客户端的Activity写入到服务端的数据库中,这也是可以实现的,请参看自定义的 Activity 等介绍。不过我要告诉你的是,如果WF运行在客户端,那么每一个客户端就会有自己的WF,而不能共享同一个工作流程,那么就涉及到你需要在多个不同的 WF 实例之间共享状态的问题。我不确定这是否是你想要的结果,很显然你把简单的问题复杂化了。

 

请在此区分客户端和服务端的概念,WF运行在服务端,多个客户端可以通过 WF 代理来共享同一个工作流程,这就好比一台UNIX主机,多个客户端可以连接在上面使用相同的系统资源(CPU,磁盘等)来完成任务。

Launcher | 园豆:45045 (高人七级) | 2012-12-18 10:21

@Launcher: 我想的流程是这样,客户端-WCF-WF。我看创建项目中有个WorkflowService的项目的,里面包含了流程,我在客户端用服务引用可以调用到。我引用WCF,但是调用到的只是WF的Receive。而且我想,我点击这个的时候,新建的流程进行保存在数据库,我看例子都是用WorkflowServiceHost,WorkflowApplication,这2个都是在宿主中使用,而且带入的参数是流程,但是用WCF的NEW 是里面的方法,而没有整个流程。

| 园豆:2 (初学一级) | 2012-12-18 10:43

@鑫: http://www.cnblogs.com/danielWise/archive/2011/03/08/1977488.html

你照着这个系列文章,一点一点的来理解吧。

Launcher | 园豆:45045 (高人七级) | 2012-12-18 10:59

@Launcher: 刚才试下了在WCF中配置,确实可以实现默认的持久化了!WCF中是调用一个一个Receive来实现下去吗?

| 园豆:2 (初学一级) | 2012-12-18 11:07

@鑫: 

http://msdn.microsoft.com/en-us/library/dd807513.aspx

http://www.cnblogs.com/zhuqil/archive/2010/04/13/DocumentApprovalProcess.html

这是微软的WF+WCF示例: DocumentApprovalProcess ,下面那个链接讲解的,你把这个例子学习会了,就基本明白了。

Launcher | 园豆:45045 (高人七级) | 2012-12-18 11:25

@Launcher: 看来得好好研究下这例子!我有运行过这例子,但是运行没什么效果,呵呵!

| 园豆:2 (初学一级) | 2012-12-18 11:33

@鑫: 没效果是吧,那你可以让这位博主 zhuqil 给你一步一步的讲解嘛。

Launcher | 园豆:45045 (高人七级) | 2012-12-18 11:40

@Launcher:呵呵!博主好像现在都没在博客园一样!他用的那个其实是微软的,写得很繁杂。我在用那个存储扩展性的,但是PersistenceParticipant不知道在配置文件怎么配置呃!里面没有说!给出的代码是这样:static Activity workflow = CreateWorkflow();
WorkflowApplication application = new WorkflowApplication(workflow);
DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension ();
application.Extensions.Add(documentStatusExtension);你知道要怎么做吗? 

| 园豆:2 (初学一级) | 2012-12-18 15:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册