我有以下设置
因此,当客户端按下按钮时,会向MVC发送一个请求,该请求将其路由到WCF,后者从外部服务聚合它,一切都很好,花花公子。
我似乎无法解决的问题是另一种方式的通信,即当其中一个外部服务脱机时,通知客户端(浏览器)的最简单,最优雅的方式是什么? / p>
这意味着该服务应以某种方式通知mvc网站,该网站应以某种方式通知客户端外部服务处于脱机状态。
此外:外部服务具有高可用性,因此很少使用“脱机”方案,因此我正在寻找一种不对服务器进行大量轮询的解决方案。
答案 0 :(得分:4)
我正在开发类似的架构,并计划使用SignalR将更新从WCF(有时直接,有时通过Azure Service Bus)推送到单页jQuery驱动的应用程序。但是我还没有实现这个,所以可能会有一些我没有考虑过的问题。
来自他们的文档:
将数据从服务器推送到客户端(而不仅仅是浏览器客户端) 一直是一个棘手的问题。 SignalR让它变得简单易行 处理所有繁重的工作。
Scott Hansleman在这里有一个关于这个主题的好博客:http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx
答案 1 :(得分:1)
您可以使用fault exceptions将异常数据返回给客户端。
我更喜欢在我的退货合约上有一个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
可以是复杂类型。 DataContract
和DataMember
属性可以是MessageContract
和MessageBodyMember
,如果这更适合您的架构。
答案 2 :(得分:1)
在我看来,您需要在轮询服务中实施某种类型来ping这些外部服务以获取其可用性。
答案 3 :(得分:0)
WCF和浏览器的典型场景是请求/响应模式。浏览器发出请求,服务响应。
您可以让浏览器定期轮询服务以查找状态。
答案 4 :(得分:0)
在Discovery Namespace中,有一些功能允许WCF服务发送发现消息。如果您有计划中断,AnnouncementClient class有服务方法可以发布有关离线/在线的消息。
要为您的用户设置自定义消息,您需要侦听这些公告消息。实现它的类是AnnouncementService。它包含处理Offline和Online消息的事件。