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

14

我完全不了解WCF。 我以为它会像常规的Web服务一样工作 - 我也很确定我做错了,但现在我想确保我做得正确。

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

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

现在直到我改变所有这些之后,我才想到它可能会对多人连接造成问题。 如果A请求数据,则B必须等待该操作完成,然后才能通过服务获取其数据。

因此,我将其更改为基于会话。 我可能实现得不对,或者它反过来根本不起作用。 客户端超时,导致错误,或者根本无法工作。 我暂时将其改回缓存状态,它似乎运行良好(除了速度慢)。

在这种情况下,“最佳实践”是什么? 是需要时即时创建客户端,基于会话创建一个客户端(并找出我做错了什么),还是保持现状并使用缓存的单个客户端方法?

3个回答

6
这种问题通常通过维护一个对象池来解决。与极端情况下只有一个服务对象和每个用户都有一个服务对象不同,池将持有一组服务对象,以支持对它们的服务的并发需求。因此,池应该只增长到最大需求点。
您需要确保在任何内部服务对象超时之前,对象从池中删除,并确保如果它们有任何异常,则删除它们。
这样,您就不必让多个客户端请求等待访问单个对象,也不必让空闲对象挂在服务中,在它们可以再次被重用之前很可能会死于老化。

1
从未想过创建客户池。这可能是两全其美的最佳选择。既不会在运行时创建大量对象,也不会在活动量很大时变慢。好主意! - TheCodeMonk
我喜欢所提到的技术,你能指出一些实现方式让我尝试一下吗? - Toran Billups
听起来有点吓人,但我已经有了一个良好实现的构想。我将进行测试,如果它按照我的预期工作,我会写一篇博客文章并记录我所做的事情。 - TheCodeMonk
@Toran- 看看这个:http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx 和这个:http://blogs.msdn.com/wenlong/archive/2007/11/14/a-sample-for-wcf-client-proxy-pooling.aspx - RichardOD

4
WCF服务的一般最佳实践是尽可能使用每次调用、单个实例模型。这样可以获得最佳吞吐量,在服务实例中获得最佳和最简单的行为。因此,除非有非常强烈的理由,否则应尽可能使用此模型。
在您的情况下,创建服务实例是一个相当昂贵的操作。也许您需要以某种方式进行清理 - 使实际的服务实例非常精简和轻量级,以便可以在眨眼之间(或更短时间内)创建和处理,然后有一些后台工作进程(或可能是一个池,如Anthony所建议的),您可以从实际的服务实例中调用它们。
Marc

1

通常,我会像你提到的那样动态创建客户端,但请确保在请求完成后将其释放。我已经这样做过了,没有遇到太多问题,但说实话,我没有1000多个用户同时访问同一个服务。

如果您感兴趣,可以在this博客文章中找到完整的实现细节。

只是为了澄清您在问题中提到的一些内容-当您说“常规Web服务”时,您是指ASMX还是其他什么?


是的,ASMX。最让我担心的是处理部分。我认为我需要进行一些重构来清理整个代码。 - TheCodeMonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接