如何:响应式可用 Wcf 双工通信

2024-02-15

我正在开发一个使用 WCF 在服务器和客户端之间进行通信的应用程序 服务器具有不断变化的服务数量,以及一项主服务,客户端可以查询有关其他服务的信息,然后使用主服务中的信息订阅他们想要的服务。

当子服务发生更改(添加、删除等)时,主服务向订阅客户端发送通知 此外,子服务每隔几秒就会发送一次通知。

这听起来像是使用 WCF 回调通道的绝佳机会,但是,它们要求您使用会话。此外,当向客户端发送通知时,当任何客户端不光彩地断开连接时,服务会挂起,并尝试通知它。即使超时,在一段时间后,在此期间没有其他客户端收到通知,这是不可接受的,因为客户端实际上是用于监控子服务后面的应用程序的 GUI。 此外,使用 MSMQ 也不是一种选择,因为服务需要立即知道发送操作何时未成功。

我想出的解决方案是使用 http 绑定(在发送失败时立即知道)并在客户端上创建显式回调服务,但这需要我编写大量看起来丑陋的基础设施代码。

所以,我的问题是:是否有更好的方法使用 WCF 来做到这一点。最好看的选项是回调合约,因为这使我无需手动管理回调服务,只要它在尝试发送到下一个客户端之前不能等待一个客户端的确认即可。


我有一个类似的环境(没有动态服务),并且当客户端通道出现故障时遇到了非常类似的问题。我想出的第一个解决方案是将回调包装在 try/catch 语句中,并在出现问题时删除有问题的客户端,但这有问题,而且看起来根本无法扩展。

我最终采用的解决方案是使用委托事件处理程序并使用 BeginInvoke 调用它。如果您还没有看过CodeProject:WCF/WPF 聊天应用程序 (Chatters) http://www.codeproject.com/KB/WCF/WCFWPFChat.aspx解决方案,我建议检查一下。

当用户登录时,将创建一个事件处理程序并将其添加到主事件中:

public bool Login() 
{
    ...
    _myEventHandler = new ChatEventHandler(MyEventHandler);
    ChatEvent += _myEventHandler;
    ...
}

每当需要广播消息时,就会异步调用事件处理程序:

private void BroadcastMessage(ChatEventArgs e)
{
    ChatEventHandler temp = ChatEvent;
    if (temp != null)
    {
        foreach (ChatEventHandler handler in temp.GetInvocationList())
        {
            handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
        }
    }
}

当返回返回时,结果将被处理,如果发生错误,该通道的事件处理程序将被删除:

private void EndAsync(IAsyncResult ar)
{
    ChatEventHandler d = null;
    try
    {
        //get the standard System.Runtime.Remoting.Messaging.AsyncResult,and then
        //cast it to the correct delegate type, and do an end invoke
        System.Runtime.Remoting.Messaging.AsyncResult asres = (System.Runtime.Remoting.Messaging.AsyncResult)ar;
        d = ((ChatEventHandler)asres.AsyncDelegate);
        d.EndInvoke(ar);
    }
    catch(Exception ex)
    {
        ChatEvent -= d;
    }
}

上面的代码是根据发布的 WCF/WPF 聊天应用程序(稍作修改)萨莎·巴伯 http://www.codeproject.com/script/Membership/Profiles.aspx?mid=569009.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何:响应式可用 Wcf 双工通信 的相关文章

  • 是否可以从 VS2010 插件刷新 WCF 服务引用?

    我想在 VS2010 插件中 模拟 右键单击 更新服务引用命令 我有一个对包含 Silverlight 项目的引用 我知道服务引用的名称和服务的 url 我发现了这个 http dedjo blogspot com 2007 03 addi
  • autofac wcf注册错误

    我正在尝试在 Wcf 上尝试使用 Autofac 进行结构 namespace WcfService1 Model DataContract IsReference true public partial class Account Dat
  • 通过 IoC 容器实例化 WCF 服务

    是否可以使 WCF 运行时通过 IoC 容器而不是通过其通常的进程来实例化服务 此外 考虑到容器的类型生活方式配置与服务的 InstanceContextBehavior 之间存在潜在冲突 这种方法会是一个糟糕的主意吗 我知道我可能完全问错
  • WCF 模拟和 SQL 可信连接?

    我们有一个托管在 IIS7 下的服务 SQL 服务器的连接字符串设置为 受信任 为了进行身份验证 我需要在服务上设置模拟并让客户端启动模拟连接 有没有办法不设置模拟并仍然允许服务通过可信连接登录到 SQL Server 我们希望避免让客户端
  • WCF:Per-Call 和 Per-Session 服务...需要说服 Per-Call 是值得的

    我们目前正在审查 WCF 服务设计 困扰我的一件事是 Per Call 和 Per Session 服务之间的决定 我相信我理解两者背后的概念 但我并没有真正看到按呼叫服务的优势 我知道使用 Per Call 服务的动机是 WCF 服务仅在
  • 将 fetch 与 Content-Type 结合使用时出现 CORS 错误 [重复]

    这个问题在这里已经有答案了 我正在尝试从 FireFox 中的不同域向 REST Web 服务发送 POST 请求 我为此使用 JavaScript 获取 函数 我在 IIS 中托管 REST Web 服务 在我在 JavaScript 中
  • 如何自定义 WCF 在序列化合约方法参数时采用的流程?

    我想设计一个人为的场景 但它有坚实的实际基础 想象一个集合类型 COuter 它是另一个集合类型 CInner 的实例的包装器 两者都实现了 IList 不用管 T 此外 COuter 实例隐藏在某个对象图内 其根 我们将其称为 R 是从
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • WCF 回调:它可以与 Java 互操作吗?

    目前 我以 正常 方式实现所有 Web 服务 也就是说 我在 Eclipse 中创建一个 WSDL 文件 然后使用 WSCF blue 一个 Visual Studio 扩展 自动生成必要的代码 它是回复 请求 不过 我希望改用回调 这样我
  • 如何在 REST WCF 服务中接受任意 JSON 对象?

    我想实现这样的服务方法 OperationContract WebInvoke RequestFormat WebMessageFormat Json ResponseFormat WebMessageFormat Json public
  • 测试项目和配置文件

    我的 Visual Studio 2008 解决方案中有这种设置 一个使用库 Lib1 需要 app config 文件中的一些配置条目 的 WCF 服务项目 WCFService 我有一个单元测试项目 MSTest 其中包含与 Lib1
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 我应该何时何地使用 WCF

    我浏览了几个在线教程 其中涵盖了 WCF 的优点 如何构建服务 客户端等 不过 我想了解一点整体情况 问题 gt 什么样的应用程序或应用程序中的哪些功能要求我使用 WCF 功能 一个具体的例子应该可以更好地帮助我 有几种情况 需要 WCF
  • 没有端点在 net.pipe://localhost/ 上监听

    我有两个 WCF 服务托管在 Windows Server 2003 计算机上的单个 Windows 服务中 如果 Windows 服务需要访问任一 WCF 服务 例如发生定时事件时 它将使用公开的五个命名管道端点之一 不同的服务协定 该服
  • WCF 服务参考支持文件未更新

    我有一个 VS 2010 解决方案 其中包含一个 WCF 服务项目和一个单元测试项目 单元测试项目有一个对WCF服务的服务引用 WCF 服务项目的 Web config 将许多绑定属性设置为非默认值 网络配置 特别注意maxBufferSi
  • WCF 与 .Net 远程处理

    根据本文 http msdn microsoft com en us library bb310550 aspx 带有命名管道的WCF是IPC的最佳选择 它比 Net Remoting快25 左右 我有以下代码 将 WCF 与命名管道与 N
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 通过代理服务器连接到 WCF 服务时出现奇怪的异常

    例外 相对 URI 不支持此操作 发生在以下情况 我有一个 WCF 服务 ServiceContract ProtectionLevel ProtectionLevel None public interface IMyService Op
  • 是否可以在自定义 WCF 服务行为中创建 TransactionScope? (异步、等待、TransactionScopeAsyncFlowOption.Enabled)

    TL DR 解释问题的截屏视频 https youtu be B Q3T5KpiYk https youtu be B Q3T5KpiYk Problem 当交易从客户端流向服务时交易 当前变成null after awaiting服务到服
  • WCF 仅跟踪失败的请求?

    我想将跟踪信息保存到 svclog 文件中 但仅限于失败的请求 这可能吗 如果是这样 具体如何 我有一个每分钟调用数百次的 WCF 服务 在极少数情况下 客户端会收到错误 500 该错误发生在 WCF 内运行的代码边界之外 通常是安全问题

随机推荐

  • Redis Slave 无法与 Master 同步

    Redis 从站不会与主站同步 连接性 我发出去的时候可以连接到master HOST NAME fakehost redis cli h HOST NAME 并使用如下命令检查主状态INFO 因此连接性不是问题 设置 从奴隶箱中 我发出了
  • 使用 Espresso IdlingResource 进行 Android 测试

    我正在尝试测试AutoCompleteTextView将在输入一些单词后显示项目 但输入和显示弹出窗口之间存在延迟 首先我用的是Thread sleep 它工作得很好 但我知道这种方法并不明确 所以我试图用IdlingResource 但这
  • 在 NetBeans 中禁用自动构建

    我正在使用 Netbeans IDE 6 7 1 我希望禁用自动构建功能 或者以某种方式更改此自动构建线程的优先级 它总是在构建 并且大大减慢了我的计算机速度 我认为正因为如此 Netbeans 有时会占用我 80 左右的 CPU 我真的不
  • HTML/CSS:滚动条出现在 HTML 元素下方

    在 Chrome 和 Safari 中 垂直滚动条出现在页面上的 HTML 内容下方 如下所示 我摆弄着 webkit scrollbar 但我能得到的最接近的是将滚动条宽度更改为0px 该部分的 div 是 displayContent
  • 如何使用 php 获取 MySQL 数据库中的枚举可能值? [复制]

    这个问题在这里已经有答案了 可能的重复 Mysql 选择枚举值 https stackoverflow com questions 4644220 mysql select enum values 我已经设立了一个专栏Mysql type
  • 如何使用 php 从 HTML 创建 pdf 文件,然后将其保存在服务器上

    我有一个项目来保存用 php 动态创建的页面并将它们存储在服务器上 我计划将该页面的副本存储为 pdf 格式 以及他们所有的图像 表格和布局 我尝试使用这些工具 DOMPDF http eclecticgeek com dompdf doc
  • android动画可以改变视图的大小吗

    是否可以通过动画改变图像大小 我想要实现的是我有一个imageView 我想使用动画来调整它的大小 将其放大 就像我设置的那样200dip在xml文件中 动画之后它变成500dip 这可能吗 我到底应该使用什么方法 任何帮助和指导将不胜感激
  • 应用程序在后台时不显示 iOS UILocalNotification

    FIXED 好的 找到了 有一个错误 UIApplication sharedApplication cancelAllLocalNotifications 在我没有预料到的时候被解雇了 好吧 这就是你的问题 感谢大家的帮助 很抱歉这只是愚
  • PHP 脚本在超过 60 秒时执行两次

    好吧 在过去的 3 个小时里 我一直在绞尽脑汁地思考这个问题 疯狂地谷歌搜索 但没有解决问题 因此 我编写了一个示例脚本来重现这一点 因为我的原始脚本大约有 800 行
  • php-excel-reader 是否支持 xlsx

    我在用php excel reader 但读取时出错 xlsx文件 那么这个支持xlsx格式吗 或者还有什么其他可用的解决方案 我的要求只是读取文件 xls xlsx and ods 并在html页面上渲染 PHPExcel似乎太多了 因为
  • Java 中的“new”有什么作用?类加载器?

    我无法在 JLS JVMSpec 或 SO 中轻松找到它 我确信肯定有人问过 那么 新 到底有什么作用呢 假设我们在A中实例化一个类B class A new B 这相当于 class A A class getClassLoader lo
  • 当不在除 P、DIV、SPAN、TD 之外的 html 标签内时,jQuery 查找/替换 html 文本

    我有一个 html 文本片段 它是页面 DOM 的一部分 我需要在其上运行查找 替换 并且我需要一些帮助来找出创建查找 替换函数的最佳方法 例如 我想获取 id content 的 dom 对象的内容 并使用目标搜索短语运行查找替换 我需要
  • python 中使用 unicode 数据的 string.translate()

    我有 3 个 API 它们将 json 数据返回到 3 个字典变量 我正在从字典中取出一些值来处理它们 我在列表中读取了我想要的具体值valuelist 步骤之一是删除其中的标点符号 我通常使用string translate None s
  • 为什么斐波那契数在计算机科学中很重要?

    斐波那契数列 http en wikipedia org wiki Fibonacci number已经成为计算机科学专业学生对递归的流行介绍 并且有一个强有力的论据表明它们在自然界中持续存在 由于这些原因 我们许多人都熟悉它们 它们也存在
  • SVG 图像标签不起作用

    我正在研究 SVG 教程here https developer mozilla org en SVG Tutorial SVG Image Tag 并且无法加载图像 XAMPP 给我一个错误 说 该 XML 文件似乎没有任何与之关联的样式
  • 从 Google 脚本将数据插入 BigQuery:遇到“”

    我正在尝试通过 Google App 脚本将数据从 Google 电子表格导入到 BigQuery 我可以下载数据 但是当我尝试执行 INSERT INTO 时出现错误 错误信息是 在第 1 行第 31 列遇到 尝试使用标准 SQL htt
  • 日语 Unicode 字体

    我正在创建一个游戏 我有一些带有文本的用户界面 最近我们想添加日语版本 但我遇到字体问题 我使用 stb freetype 来光栅化字体 并且我支持 Unicode 所以这应该不是问题 但大多数字体似乎不包含日语字符 在 Windows 上
  • 将 boost::shared_lock 升级为独占锁

    有人可以解释一下 boost upgrade lock 的正确用法吗 下面的代码会导致死锁 Global typedef boost shared mutex Mutex typedef boost shared lock
  • 在Python中从其他文件调用变量

    我正在尝试导入文件 情况如下 file1 py 包含 from file2 import username steven action file2 py 包含 def action print username 但我无法打印用户名 因为变量
  • 如何:响应式可用 Wcf 双工通信

    我正在开发一个使用 WCF 在服务器和客户端之间进行通信的应用程序 服务器具有不断变化的服务数量 以及一项主服务 客户端可以查询有关其他服务的信息 然后使用主服务中的信息订阅他们想要的服务 当子服务发生更改 添加 删除等 时 主服务向订阅客