从WCF服务向网站发送数据

时间:2012-10-12 14:57:43

标签: c# jquery asp.net-mvc wcf error-handling

我有以下设置

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

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

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

这意味着该服务应以某种方式通知mvc网站,该网站应以某种方式通知客户端外部服务处于脱机状态。

此外:外部服务具有高可用性,因此很少使用“脱机”方案,因此我正在寻找一种不对服务器进行大量轮询的解决方案。

5 个答案:

答案 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可以是复杂类型。 DataContractDataMember属性可以是MessageContractMessageBodyMember,如果这更适合您的架构。

答案 2 :(得分:1)

在我看来,您需要在轮询服务中实施某种类型来ping这些外部服务以获取其可用性。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

Discovery Namespace中,有一些功能允许WCF服务发送发现消息。如果您有计划中断,AnnouncementClient class有服务方法可以发布有关离线/在线的消息。

要为您的用户设置自定义消息,您需要侦听这些公告消息。实现它的类是AnnouncementService。它包含处理OfflineOnline消息的事件。