4

这是一个更多的“可以完成”而不是“如何完成”的问题。我正在考虑构建一个服务(中间层,.net,提供数据抽象和一些业务逻辑),供不同平台上的多个内部客户端系统使用。例如,一个客户端可能是一个网站,另一个客户端一些 java 代码,另一个客户端 C# 等。

我想在我的服务中提供同步和异步 API,例如 GetData、BeginGetData、EndGetData 方法。我还希望客户能够注册新“数据”被添加到系统的通知。过去,我使用带有 Tibco EMS 通道的 Web 服务来实现这一点。

我的问题是:我能否通过公开 WCF 服务来实现这三个要求(同步、异步和发布/订阅)?非 WCF 客户端可以使用此服务吗?

原谅这个问题含糊不清 - 我可以根据需要详细说明。

提前致谢。

4

2 回答 2

3

默认情况下,方法是同步的。要使它们异步,您需要添加此属性 [OperationContract(AsyncPattern=true)] 并返回一个 IAsynchResult,就像您使用 Winform 执行 BeginIvoke() 一样。(在这里阅读更多http://msdn.microsoft.com/en-us/library/ms734701.aspx

您可以使用称为回调合同的东西进行发布/订阅(尽管我不确定在其他平台上实现此功能)我对这些没有太多经验,但它们似乎并不十分复杂(您可以在此处阅读更多信息http: //dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm )

于 2008-12-09T18:25:29.410 回答
2

在您的 WCF 服务上设置异步操作可以通过设置 AsyncPattern=true 来像 Ninja 发布的那样完成,也可以通过设置正确的命令行参数或通过检查“生成”告诉 svcutil 生成异步端点来在客户端完成svcutil 的 GUI 版本中的“异步操作”选项。生成异步仍然会生成同步操作。

客户端异步选项的问题是您需要在 Java 中复制代码。Svcutil 确实会按照您的指定导出 VB 或 C# 代码,因此您很可能无需太多工作就可以将 C# 代码转换为 Java。

对于 Pub/Sub,客户端回调是您想要操作的方式。我正在使用它们,它们工作得很好。在根级别,它们是.Net Remoting 并使用事件将数据传递给客户端(我的理解)。我无法确认这可以跨平台使用,但应该进行一些工作。

于 2008-12-10T15:47:33.957 回答