7

我有以下设置

  • 一个jQuery网站(不完全是单页,但离它不远),它使用
  • 一个 ASP.NET MVC 网站作为后端,它(通过 net.tcp 或 net.pipe)连接到
  • 一个自托管的 WCF 服务,用于管理和连接到
  • 大量的高延迟外部服务。

因此,当客户端按下按钮时,会向 MVC 发送请求,然后将请求路由到 WCF,WCF 从外部服务聚合它,一切都很好。

我似乎无法解决的问题是另一种方式的通信,即当一个外部服务脱机时,通知客户端(浏览器)的最简单和最优雅的方式是什么?

这意味着该服务应该以某种方式通知 mvc 站点,该站点应该以某种方式通知客户端外部服务已脱机。

另外:外部服务将具有高可用性,因此很少使用“离线”场景,因此我正在寻找一种不会对服务器进行广泛轮询的解决方案。

4

5 回答 5

4

我正在研究类似的架构,并计划使用SignalR将更新从 WCF(有时直接,有时通过 Azure 服务总线)推送到单页 jQuery 驱动的应用程序。不过,我还没有实现这个,所以可能有一些我没有考虑过的问题。

从他们的文档中:

将数据从服务器推送到客户端(不仅仅是浏览器客户端)一直是一个棘手的问题。SignalR 让一切变得简单,并为您处理所有繁重的工作。

Scott Hansleman 有一个关于这个主题的好博客:http ://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

于 2012-10-12T16:17:50.557 回答
1

在我看来,您将需要在轮询服务中实现某种类型来 ping 这些外部服务以确保它们的可用性。

于 2012-10-12T15:11:00.730 回答
1

您可以使用故障异常将异常数据返回给客户端。

我更喜欢IsSuccessful在我返回的合同上有一个标志,并且只在出现严重错误时抛出错误异常。

IsSuccessful这是带有标志的响应合同的一个非常基本的示例。

[DataContract]
public class MyResponse
{
    [DataMember]
    public bool IsSuccessful { get { return Message == null || !Messages.Any(); } set { } }
    [DataMember]
    public List<string> Messages { get; set; }
}

Messages如果您需要提供更详细的信息,可以是复杂类型。DataContractDataMember属性可以MessageContractMessageBodyMember如果这更适合您的架构。

于 2012-10-12T15:05:16.917 回答
0

Discovery 命名空间中有允许 WCF 服务发送发现消息的功能。如果您有计划的中断,则AnnouncementClient 类具有让服务发布有关离线/在线消息的方法。

要为您的用户设置自定义消息,您需要收听这些公告消息。实现这一点的类是AnnouncementService。它具有处理离线在线消息的事件。

于 2012-10-12T15:14:48.780 回答
0

WCF 和浏览器的典型场景是请求/响应模式。浏览器发出请求,服务做出响应。

您可以让浏览器定期轮询服务以查找状态。

于 2012-10-12T15:07:50.987 回答