这是一个“可以做到”而不是“如何完成”的问题。我正在寻找构建一个服务(中间层,.net,提供数据抽象和一些业务逻辑),将由不同平台上的多个内部客户端系统使用。例如。一个客户端可能是一个网站,另一个客户端可能是一些Java代码,另一个客户端是C#,等等。
我想在我的服务中提供同步和异步API,例如GetData,BeginGetData,EndGetData方法。我还希望客户能够注册添加到系统中的新“数据”的通知。在过去,我使用带有Tibco EMS频道的Web服务来实现这一点。
我的问题是:我可以通过公开WCF服务来实现三个要求(synch,asynch和pub / sub)吗?非WCF客户端可以使用此服务吗?
请原谅这个问题的模糊性 - 我可以根据需要详细说明。
提前致谢。
答案 0 :(得分:3)
默认情况下,方法是同步的。要使它们成为异步,你需要添加这个属性[OperationContract(AsyncPattern = true)]并返回一个IAsynchResult,就像你用winforms做BeginIvoke()一样。 (在这里阅读更多http://msdn.microsoft.com/en-us/library/ms734701.aspx)
您可以使用称为回调契约的内容进行发布/订阅(虽然我不确定在其他平台中实现这一点)我对这些没有太多经验,但它们似乎没有很大的收集(你可以阅读更多这里http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm)
答案 1 :(得分:2)
通过设置AsyncPattern = true,可以在Ninja上设置异步操作,也可以在客户端通过告诉svcutil通过设置正确的命令行参数或通过检查生成异步端点来完成svcutil的GUI版本中的“生成异步操作”选项。生成异步仍然会生成同步操作。
客户端异步选项的问题是您需要在Java中复制代码。 Svcutil会按照您的指定导出VB或C#代码,因此您很可能将C#代码转换为Java而无需太多工作。
对于Pub / Sub,客户端回调是您想要操作的方式。我正在使用它们并且它们工作得很好。在根级别,它们是.Net Remoting并使用事件将数据传递给客户端(我的理解)。我无法确认这可以跨平台使用,但它应该有一些工作。