在ASP.Net应用程序和最佳实践中使用WCF

时间:2009-05-22 19:50:35

标签: asp.net wcf

我是WCF的新手。我很确定它会像常规的Web服务一样工作 - 而且我也很确定我也做错了,但现在我想确保我做得对。

我们的ASP.Net应用程序通过互联网连接到WCF服务。我已经实现了基本的安全性并使用了SSL。它工作正常,但比我们定期进行Web服务时要慢。返回的数据与常规Web服务基本相同。

当我使用常规Web服务时,无论何时我需要获取数据,我都会创建一个新的服务对象并为我需要的数据调用该函数。这似乎工作正常,但正如我想象的那样,不是最好的方法,特别是如果有成千上万的用户同时连接。因此,当我转换为WCF时,我决定保持一个客户端打开,并将其用于连接到该站点的每个人。我把它放在缓存中,当缓存转储对象时,我有一个回调函数来处理它。

现在我甚至都没想过,直到我改变这一切之后,这可能会给多人连接造成问题。如果人A请求数据,则人B必须等待该数据完成才能通过该服务获取数据。

所以我把它改成了基于会话的。我要么实施了这个错误,要么只是适得其反,因为它根本不能正常工作。客户端会超时,导致故障,或者只是不能正常工作。我把它改回原来的缓存状态,似乎工作正常(除了慢)。

这种情况的“最佳做法”是什么?我是否需要在需要时动态创建客户端,创建一个基于会话(并弄清楚我做错了什么),或保持原样并使用一个客户端缓存方法?

3 个答案:

答案 0 :(得分:6)

这种问题通常通过维护池来解决。池不是仅在一个极端中具有一个服务对象而在另一个极端中具有每个用户一个,而是将拥有支持其服务的并发需求所需的服务对象的集合。因此,池应该只增长到最大需求点。

您可以确保在服务对象内部的任何其他超时之前将对象从池中删除,并确保它们在有任何异常时退出。

通过这种方式,您没有多个客户端请求等待访问单个对象,也没有空闲对象在服务中闲置,并且可能会在它们再次被重复使用之前死亡。

答案 1 :(得分:4)

WCF服务的一般最佳实践是尽可能使用每个呼叫的单实例模型。这为您提供了最佳吞吐量,服务实例中最佳和最简单的行为。所以只要有可能,除非你有一个非常令人信服的理由,否则请使用这个模型。

在您的情况下,创建服务实例似乎是一项相当昂贵的操作。也许你需要以某种方式清理它 - 使实际的服务实例非常精简和轻量级,以便它可以在眨眼间(或更少)创建和处理,然后有一些后台工作进程(或者可能是一个池)那些,正如安东尼所建议的那样,你可以从实际的服务实例中调用它们。

马克

答案 2 :(得分:1)

我通常会像您提到的那样动态创建一个客户端,但请确保在请求完成后将其处理掉。我已经完成了很多问题,但说实话,我没有1000多名用户同时使用完全相同的服务。

如果您有兴趣,可以在this博文中找到具体的实施细节。

只是为了澄清你在问题中提到的内容 - 当你说“常规网络服务”时,你在谈论ASMX还是?