从 WCF 服务向网站发送数据
Posted
技术标签:
【中文标题】从 WCF 服务向网站发送数据【英文标题】:Sending data to a website from a WCF service 【发布时间】:2012-10-03 10:18:16 【问题描述】:我有以下设置
一个使用 的 jQuery 网站(不完全是单页,但离它不远) 一个 ASP.NET MVC 网站作为后端,它(通过 net.tcp 或 net.pipe)连接到 管理和连接到的自托管 WCF 服务 过多的高延迟外部服务。因此,当客户端按下按钮时,会向 MVC 发送请求,然后将请求路由到 WCF,WCF 从外部服务聚合它,一切都很好。
我似乎无法解决的问题是另一种方式的通信,即当一个外部服务离线时,通知客户端(浏览器)的最简单和最优雅的方式是什么?
这意味着服务应该以某种方式通知 mvc 站点,该站点应该以某种方式通知客户端外部服务已离线。
另外:外部服务将具有高可用性,因此很少使用“离线”场景,因此我正在寻找一种不会对服务器进行广泛轮询的解决方案。
【问题讨论】:
如何定义“离线”?暂时无法访问?由外部服务的管理员关闭以进行维护?这是否严格用于处理“计划内”中断,或者您是否希望优雅地处理任何无法联系远程服务的问题? @RickLiddle“变黑”在这里可能是一个更好的词。基本上,当外部服务(在我的命令之外)没有响应时。 我强烈推荐 JcFx below 提供的 SignalR 建议。 【参考方案1】:我正在研究类似的架构,并计划使用SignalR 将更新从 WCF(有时直接,有时通过 Azure 服务总线)推送到单页 jQuery 驱动的应用程序。不过,我还没有实现这个,所以可能有一些我没有考虑过的问题。
来自他们的文档:
将数据从服务器推送到客户端(不仅仅是浏览器客户端) 一直是个棘手的问题。 SignalR 让它变得非常简单,并且 为您处理所有繁重的工作。
Scott Hansleman 有一篇关于这个主题的好博客:http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx
【讨论】:
赞成 -- 优秀的解决方案,为手头的问题提供可行的答案,并包含大量资源。这就是 IMO,*** 上的答案应该是什么模型。【参考方案2】:您可以使用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
,如果这更适合您的架构。
【讨论】:
简单的Json是不是容易多了? 我可能没有把问题说清楚,抱歉。客户端没有请求,服务器应该发起通信。【参考方案3】:在我看来,您需要在轮询服务中实现某种类型来 ping 这些外部服务以确保它们的可用性。
【讨论】:
这已在 WCF 服务级别上实现,并可根据请求提供给客户端。问题是现在我需要以事件驱动的方式发送给客户端。 什么是客户端?这是基于网络的吗? 是的,我已经这样描述了。【参考方案4】:WCF 和浏览器的典型场景是请求/响应模式。浏览器发出请求,服务做出响应。
您可以让浏览器定期轮询服务以查找状态。
【讨论】:
外部服务会有高可用,所以很少使用“下线”的场景,因此我正在寻找一种不对服务器进行广泛轮询的解决方案。 在这种情况下,只需在外部服务离线并且浏览器发出需要它的请求时返回一个错误。【参考方案5】:在Discovery Namespace 中有允许WCF 服务发送发现消息的功能。如果您有计划的中断,AnnouncementClient class 有方法让服务发布有关离线/在线的消息。
要为您的用户设置自定义消息,您需要收听这些公告消息。实现这个的类是AnnouncementService。它具有处理Offline 和Online 消息的事件。
【讨论】:
以上是关于从 WCF 服务向网站发送数据的主要内容,如果未能解决你的问题,请参考以下文章
从 jquery 向 wcf webservice 发送数据