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

【讨论】:

简单的Json是不是容易多了? 我可能没有把问题说清楚,抱歉。客户端没有请求,服务器应该发起通信。【参考方案3】:

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

【讨论】:

这已在 WCF 服务级别上实现,并可根据请求提供给客户端。问题是现在我需要以事件驱动的方式发送给客户端。 什么是客户端?这是基于网络的吗? 是的,我已经这样描述了。【参考方案4】:

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

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

【讨论】:

外部服务会有高可用,所以很少使用“下线”的场景,因此我正在寻找一种不对服务器进行广泛轮询的解决方案。 在这种情况下,只需在外部服务离线并且浏览器发出需要它的请求时返回一个错误。【参考方案5】:

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

要为您的用户设置自定义消息,您需要收听这些公告消息。实现这个的类是AnnouncementService。它具有处理Offline 和Online 消息的事件。

【讨论】:

以上是关于从 WCF 服务向网站发送数据的主要内容,如果未能解决你的问题,请参考以下文章

从 jquery 向 wcf webservice 发送数据

向 WCF 服务发送数据

使用 KSOAP2 从 Android 向 WCF 发送数据

从jquery发送数据到wcf Web服务

WCF - 无法发送数据

向 WCF 发送集合时,远程服务器返回错误:NotFound