如何:响应式可用 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 双工通信 的相关文章

  • WCF 错误:相对端点地址

    嗯 对 WCF 还很陌生 我想我有点搞砸了 这就是我到目前为止所做的 我在 IIS 中托管了我的 WCF 服务 首先是合同 using System using System Collections Generic using System
  • 使用 Web 部署在 IIS Express 上发布 WCF 服务应用程序

    我想在 IIS Express 上发布在 Visual Studio 2010 中创建的 WCF 服务应用程序 所以我使用项目 gt 发布 gt Web 部署 Service URL http localhost Site applicat
  • 关于数据库变更的通知

    我正在尝试一种场景 其中我想使用任何用户提交的更改来更新在不同 PC 上运行的桌面 UI 例如 Application1 安装在 PC1 PC2 和 PC3 上 假设所有 PC 都运行此应用程序 假设 PC1 上的用户 1 更改数据并提交到
  • 替换 WCF 默认 JSON 序列化

    是否可以替换 WCF 的默认 JSON 序列化 我目前正在使用webHttp行为 并通过application json作为 MIME 类型 特别是 我不喜欢默认情况下每个属性都是键 值对 例如 Key PropertyName Value
  • 如何处理 WCF 中不正确的 SOAP 错误?

    我必须使用 SOAP 来使用第三方 Web 服务 让它与 WCF 一起工作很容易 但现在我遇到了 SOAP 错误的问题 该服务向我发送了不正确的 SOAP 错误
  • ASP.NET Identity 2.0解密Owin cookie

    我正在应用多租户的服务器端应用程序中工作 在这个服务器端我有一个后台 ASP NET MVC 和后端 WCF 我想解密身份 cookie 以便我可以检查它是否有效并使用它在 WCF 服务中进行身份验证 更具体地说 我真的想知道 ASP NE
  • RESTful WCF 的最低配置

    为了让 WCF 与 REST 一起工作 我至少需要在 web config 中放入什么 我已经用 WebGet 注释了我的方法 但他们没有收到消息 我发现您可以将以下内容添加到 svc 文件中的 ServiceHost 指令中 它会自动为您
  • 没有 ASP.NET/IIS 的 .NET Web 服务?

    我正在实现一个需要公开 Web 服务接口的服务器组件 但应用程序不需要它在 IIS 上与 ASP NET 一起运行 有没有一种直接的方法可以在不使用 ASP NET IIS 的情况下在 NET 中实现 Web 服务 我使用的是 NET 3
  • 使用 NSubstitute 模拟动作

    Web 服务的代理需要进行单元测试 而无需 显然 访问 Web 服务 这就是我想要绝育的方法 public void Invoke Action
  • 由于 EndpointDispatcher 上的 AddressFilter 不匹配,无法在接收方进行处理

    我正在使用启用 ajax 的 WCF 当我在 Web 浏览器中打开 url 时 出现此错误 带有 Action 的消息http localhost 22219 MobileService svc GetProductCategories h
  • 通过 WCF 提供类对象的数组或列表

    任何提供自定义类对象列表或数组的 WCF 客户端服务器示例都会对我有所帮助 但这是我到目前为止所得到的 这是我想提供的班级系统 namespace NEN Server FS Serializable public class XFS pr
  • 实体框架和数据库集

    我正在尝试设置一个通用接口来从存储库中检索实体 问题是我需要从 WCF 服务请求数据 而据我所知 泛型不能与操作合约一起使用 所以我有这个在控制台应用程序中工作 而不是使用服务调用 public virtual List
  • WCF 的“using”语句中出现异常,未正确关闭连接。如何关闭有故障的 WCF 客户端连接或出现异常的连接?

    StackOverflow 上有几个有关关闭 WCF 连接的问题 但排名最高的答案是指此博客 http marcgravell blogspot com 2008 11 dontdontuse using html http marcgra
  • 服务具有零个应用程序(非基础设施)端点

    我最近创建了一个WCF服务 dll 和一个服务主机 exe 我知道我的 WCF 服务工作正常 因为我能够成功地将服务添加到 WcfTestClient 但是 当我从服务主机 exe 使用 WCF 时 我似乎遇到了问题 我可以将对 WCF d
  • WCF 服务引用从 WSDL 生成 void 方法

    这是我第一次尝试使用 WCF 所以我猜我做错了什么 我正在尝试访问 WSDL 定义的肥皂服务http confluence atlassian com rpc soap axis confluenceservice v1 wsdl http
  • 使用 HttpClient 调用 WCF 服务

    我必须调用 WCF 服务 WCF 服务已开启 我可以编辑其配置 我想创建一个调用该服务的客户端 我无法将服务引用添加到我的客户端 因此我尝试使用 HttpClient 调用它 客户端代码 using var client new HttpC
  • 如何用单线程实现TCP上的全双工通道?

    我正在编写的网络库需要通过 TCP 套接字发送和接收消息 消息可以随时发送或接收 即应该作为全双工通道工作 我能够使用两个线程来实现这样的场景 调用 send 的主线程和一个主要在 receive 调用处阻塞的专用线程 我的问题是 是否可以
  • 具有订阅者缓存的 WCF Pub/Sub

    Problem 如何使用 WCF 提供分布式 可扩展且具有抗灾能力的发布 订阅服务 Details 请注意 除了 Tibco EMS 等消息传递 中间件解决方案之外 我们还在考虑这种方法 我一直在研究 WCF 特别是如何使用它来提供发布 订
  • 响应消息的内容类型 application/xml;charset=utf-8 与绑定的内容类型不匹配 (text/xml;charset=utf-8)

    我尝试使用独立应用程序使用 WCF Web 服务 我可以使用 Internet Explorer 查看此服务 也可以在 Visual Studio 中查看服务引用 这是我收到的错误 The content type text html ch
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact

随机推荐

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