我们当前正在运行 WCF 服务和 COBOL VM 进行通信,以提供对 Vision 文件中的数据的访问。 该过程有效,但我们必须将 WCF 服务限制为
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
。 它可以工作,但有时对用户来说显得很慢,因为它们正在排队,并且某些请求有时会长于几秒钟。
COBOL VM 是单例,所以我不相信我可以将我的 COBOL 程序与多个 WCF 服务请求隔离,而不让它们互相干扰。 COBOL 程序无法知道哪个调用是针对哪个客户端的,它只是返回/操作数据。
我的想法是在 COBOL 中创建一个程序来管理我的请求,但我不确定如何将该信息返回到 WCF 服务,以便它响应正确的客户端请求。
我的想法是传递WCF客户端请求的一些ID,比如guid。 COBOL 程序将存储 WCF guid 并调用另一个程序,该程序使用该 guid 在 COBOL 中获取数据。 然后,COBOL 程序返回带有 ID 的数据,但我需要某种方法来确保将正确请求的数据路由到正确的 WCF 客户端请求。
过程:
WCF Client 1->WCF Service (creates WCF_id1)->COBOL program 1(WCF_id1)->COBOL getData(WCF_id1).
WCF Client 2->WCF Service (creates WCF_id2)->COBOL program 1(WCF_id2)->COBOL getData(WCF_id2).
WCF Service stores both Wcf_id1 and Wcf_id2 somehow associating them with the WCF Client that requested them.
COBOL program 1 stores both Wcf_id1 and Wcf_id2 and makes the request to COBOL getData individually passing in the ids.
Both Client 1 and Client 2 are waiting for a response.
COBOL getData(WCF_id2)->COBOL program 1(WCF_id2)->WCF Service(WCF_id2)
从这里开始,我如何确保 WCF 客户端 2 获取此数据而不是 WCF 客户端 1?
我想查看 COBOL 程序返回的数据,然后将其路由到请求它的客户端。 这在 WCF 中可能吗?
我一直在研究 WCF 回调,认为我也许能够使用回调来查询 WCF_id,然后将数据返回到正确的 WCF 客户端。
我走在正确的道路上吗? 我应该考虑其他一些 WCF 功能吗?
我看到“COBOL getData”一次处理一个请求,因为它是单例的。如果您将 wcf 实例设置为单例,则来自客户端的所有请求将是连续的,并且一个请求将等待另一个请求。 因此,您不需要在其他 cobol 程序“COBOL 程序 1”中管理带有 ID 的请求。只需添加下面的服务行为即可
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
如果您希望您的服务能够更好地响应客户端,而不阻塞 GUI,您必须使用回调来构建您的服务。将您的 cobol 程序调用者放入单例类中并对其进行同步以防止并发访问。在 WCF 服务方法中,在线程池操作中调用 cobol 调用方。 cobol 程序返回后,调用回调通知客户端。考虑到只有 nettcpbinding、namedpipebinding 和 wsdualhttpbindins 支持回调操作。
查看这些链接: