异步双工WCF +流程管理器

肢端炎

我正在寻找一种让客户端从客户端UI到WCF服务主机调用异步流程,然后将流程状态通知客户端的方法。我猜这可以通过sagas(流程管理器),域事件和WCF双工连接来实现,但我不确定如何实现!

案件顺序(我想)如下:

  1. 客户调用流程
  2. 客户端创建WCF代理
  3. 代理连接到服务主机
  4. 服务主机创建到客户端的双工通道
  5. 服务主机使用命令总线启动进程并通过双工通道
  6. 进程状态发生变化!
  7. 找到相关的双工通道
  8. 推回状态更改
  9. 客户收到状态更改并可视化

我说得对吗?简而言之,相关类看起来如何?是的,我知道NServiceBus(在这种情况下会被提及很多),但是我不想依赖其他框架(我已经有很多NServiceBus可以自己解决的问题,并且我已经在使用数百种了)各种东西的不同框架..)

编辑: 示例下面是一个可以说明我的问题的真实示例。

我有一个图像处理服务器,可以对图像进行一些魔术和独角兽的处理。WCF客户端将图像上载到服务器,然后显示进度条,指示已处理了多少图像。服务器启动一个新的ImageProcessService(在请求范围内)。在处理过程中,他可能会抛出许多ImageProcessStateChanged事件,并带有一个以百分比表示该过程的数字。完成后,他可能会抛出ImDoneEvent。所有事件都应由事件总线捕获,该事件总线会将它们发回正确的客户端。该过程最多可能需要60秒,并且每个客户端可以触发一次,但是要尽可能多地启动。

十二面体

听起来您正在寻找的只是通过在操作合同上设置IsOneWay = true启用的行为。当您在操作合同中设置IsOneWay = true时,调用方将发送请求,但不等待响应。为了获得您的响应,被叫方将需要在双工通道的回调通道上调用另一个操作,该操作也已设置IsOneWay = true。

这是一个简单的示例:

服务合同:

[ServiceContract( CallbackContract = typeof( IClientCallback ), SessionMode = SessionMode.Required )]
public interface IClientService
{
    [OperationContract( IsInitiating = true )]
    void CreateSession( string windowsUserName );
    [OperationContract( IsOneWay = true )]
    void LongOp( );
    [OperationContract( IsTerminating = true )]
    void Terminate( );
}

客户回拨合同:

[ServiceContract]
public interface IClientCallback
{
    [OperationContract( IsOneWay = true )]
    void LongOpResponse( );
}

服务实施:

class ServerService : IClientService
{
    public void CreateSession( string windowsUserName )
    {
        //Do stuff to set up your session as desired
    }

    public void LongOp( )
    {
        //Do something that takes a long time
        LongRunningFunctionCall();
        Callback.LongOpResponse();
    }

    public void Terminate( )
    {
        //Do stuff to tear down your session
    }

    public IClientCallback Callback { get { return OperationContext.Current.GetCallbackChannel<IClientCallback>( ); } }
}

客户端回调实现:

class CallbackHandler : IClientCallback
{
    public void LongOpResponse( )
    {
        Console.WriteLine( "Received long operation response from server." );
    }
}

只要您引用了处理每个会话的客户端服务对象,就可以直接通过该对象访问其回调通道,因此您可以从服务器应用程序中的任何位置在回调协定上启动一个函数,只要通道是开放的。

通常,在双工通道的服务合同中,单向操作比使用IsOneWay = false进行的操作要多得多,除了立即响应对于调用应用程序的持续运行至关重要的操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

异步作为方法结果管理器?

异步上下文管理器

用户管理器发现异步错误

取消异步上下文管理器

多个异步上下文管理器

Rxjava和工作管理器链接异步调用

任务管理器及其与Java流程的相关性

此流程管理器状态是否应保留?

基于Node.js的流程管理器如何工作?

在蓝牙管理器组件侦听器函数中发出处理异步函数

HierarchicalLifetimeManager是用于WCF客户端/ ChannelFactory的正确的生存期管理器吗?

用于EF DbContext的WCF自定义操作扩展生命周期管理器

WCF应用程序托管的服务未出现在服务管理器中

如何模拟aiohttp.client.ClientSession.get异步上下文管理器

将超时添加到异步上下文管理器

如何在Python 3中嵌套异步上下文管理器

ShellFolder.EnumObjects-Windows资源管理器上的异步

Mixinig异步上下文管理器并在Asyncio中直接等待

您可以将self.assertRaises用作异步上下文管理器吗?

导入错误:无法导入名称“异步上下文管理器”

以管理员身份运行任务管理器(流程浏览器)

如何在大管理器中同时运行异步启动器/同时运行异步功能

WCF忽略webhttpbinding中的双工

php-fpm如何使用动态流程管理器管理工人?

外部异步上下文管理器在内部异步生成器之前完成

用Sysinternals流程浏览器替换原始任务管理器后,将其还原

更改通过谷歌标签管理器添加并在 iframe 中异步加载的小部件的 css 属性

如何将管理器对象传递给流程

使用Gunicorn作为流程管理器将New Relic与Tornado应用程序集成