Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用WCF实现observer模式_C#_.net_Asp.net_Wcf_Web Services - Fatal编程技术网

C# 用WCF实现observer模式

C# 用WCF实现observer模式,c#,.net,asp.net,wcf,web-services,C#,.net,Asp.net,Wcf,Web Services,当我第一次发布这个问题时,我的web服务和应用程序控制器之间有很强的耦合,控制器需要打开服务的多个线程,当它接收到返回的数据时,它必须对返回的数据进行大量处理,并将其合并到一个数据集中。我不喜欢这样一个事实,即客户机必须在返回的数据准备好使用之前进行如此多的处理和合并,并希望将该层移动到服务中,让服务向供应商打开异步线程,并在返回给客户机之前合并结果 我面临的一个挑战是,我不能等到所有线程完成并合并结果,我必须开始接收可用的数据。这就要求我在服务上实现一个观察者模式,以便在合并新的结果集并准备好

当我第一次发布这个问题时,我的web服务和应用程序控制器之间有很强的耦合,控制器需要打开服务的多个线程,当它接收到返回的数据时,它必须对返回的数据进行大量处理,并将其合并到一个数据集中。我不喜欢这样一个事实,即客户机必须在返回的数据准备好使用之前进行如此多的处理和合并,并希望将该层移动到服务中,让服务向供应商打开异步线程,并在返回给客户机之前合并结果

我面临的一个挑战是,我不能等到所有线程完成并合并结果,我必须开始接收可用的数据。这就要求我在服务上实现一个观察者模式,以便在合并新的结果集并准备好使用时通知我的应用程序,并将它们发送到应用程序


我一直在寻找如何在ASMX webservices或WCF上实现这一点,到目前为止,我发现它是使用WCF实现的,但该线程始终可以提供建议和改进。

实现这一点的方法之一是异步调用WS(,),然后在回调中更新GUI


但是,如果查询数据的时间过长,则可能会出现超时问题。例如,如果供应商的一个网站关闭或速度非常慢,这可能意味着整个查询可能会失败。如果客户端的业务逻辑进行合并而不是WS进行合并,可能会更好。

不确定此解决方案是否适合您的特定任务,但无论如何:

  • 向WS-API添加分页参数(int pageNumber、int pageSize、out int totalPages)
  • 添加一个短暂的TTL缓存,将请求细节(可能是散列值)与输出数据关联起来
  • 当应用程序请求第一页时,请在准备好后立即返回,并将收集/合并的全部数据放入缓存,以便在需要下一页时可以使用已准备好的内容


    <>但请注意,您将无法获得最新的数据,请谨慎配置缓存重载间隔。

    < P>这听起来是Windows工作流基础的完美使用案例。您可以轻松创建一个工作流,从每个供应商处获取信息,然后在准备就绪时合并结果。它干净多了,WF将为您完成所有异步工作。

    在您的场景和技术中进行归档的绝对最佳方式是在您的web应用程序/库与web服务之间使用某种令牌,并且您的控制器需要有一个线程来检查是否有新结果等。但是请注意,您需要获得合并时从WS返回的完整数据可能会导致从初始响应中删除项


    或者我仍然认为,使用WCF Web服务从controller处理线程会更好一些

    除了ASMXWeb服务的经典请求-应答操作外,WCF还支持其他操作类型,如;单向呼叫、双工回调和流式处理

    不难猜测,双工回调就是我要找的

    双工回调只允许服务对客户端进行回调。在服务器上定义了一个回调协定,客户机需要在每次调用时提供回调端点。然后由服务决定何时以及使用回调引用的次数

    只有支持双向A的绑定支持回调操作。WCF提供了WSDualHttpBinding来支持HTTP上的回调(NetNamedPipeBinding和NetTcpBinding也支持回调,因为TCP和IPC协议支持双工通信)

    这里需要注意的一件非常重要的事情是,双工回调是非标准的、纯Microsoft特性。这不会对我手头的当前任务造成问题,因为我的web服务和应用程序都在Microsoft ASP.NET上运行

    在WCF上给了我一个很好的开始。它有700多页,深入研究了所有WCF概念,并专门有一章介绍回调和其他类型的操作

    我在网上找到的其他一些好资源有:


    我不太确定这里是否需要双工。。。在我看来,带有回调的标准异步调用应该足以获得数据传递通知

    最大的问题是什么?如果您谈论的是异步等,那么通常我们谈论的是将数据发送到客户机所需的时间。这是因为数据量过大吗?还是在服务器上生成数据的复杂性


    如果是数据量,那么我可以想出许多显著提高性能的方法——尽管其中大多数都涉及使用DTO对象(而不是问题中暗示的
    DataSet
    /
    DataTable
    )。例如,大大减少了传输数据所需的数据量和处理。

    谢谢,我可以用我在第一篇文章中提到的类似方式处理这个问题,处理多个请求并接收任何准备就绪的内容。我希望有一些不那么难闻的方法,特别是使用WCF。我想我会在wcf上弄脏我的手,看看我能想出什么,当他们的业力只有77时,他们怎么能提供+100赏金?因为这样加上50。所以他们实际上提供了50个代表,另外50个。“改进我的网络服务”是一个非常通用的标题。如果您在问题中提到WCF和异步请求,您可能会得到更多帮助。+1“使用WCF实现观察者模式”是一个更好的标题!这也是我目前提出的方法。。我不喜欢总是用线程询问WS-with-threads的做法。寻找更好的模式。希望我能尽快对此做一些研究,并发布我的想法。。