【问题标题】:Using WCF in an ASP.Net Application and Best Practices在 ASP.Net 应用程序中使用 WCF 和最佳实践
【发布时间】:2009-05-22 19:50:34
【问题描述】:

我对 WCF 完全陌生。我很确定它会像常规 Web 服务一样工作 - 我也很确定我做错了,但现在我想确保我做对了。

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

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

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

所以我将其更改为基于会话。我要么实施了这个错误,要么适得其反,因为它根本无法正常工作。客户端会超时,导致错误,或者根本无法工作。我现在把它改回缓存,它似乎工作正常(除了慢)。

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

【问题讨论】:

    标签: asp.net wcf


    【解决方案1】:

    这类问题通常通过维护一个池来解决。在一个极端只有一个服务对象,在另一个极端每个用户一个,池将保存一组服务对象,这些服务对象需要支持对其服务的并发需求。因此,池应该只增长到最大需求点。

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

    这样,您就不会有多个客户端请求等待访问单个对象,也不会有空闲对象在服务中闲逛,并且很可能在它们再次被重用之前就死了。

    【讨论】:

    • 从未想过创建一个客户池。这可能是两全其美。不会即时创建大量对象,也不会在有大量活动时放慢速度。好主意!
    • 我喜欢上面提到的技术,你有什么方法可以指出这个实现,这样我就可以玩了吗?
    • 这听起来很可怕,但我已经准备好对此进行良好的实现。我将对其进行测试,如果它按预期工作,我将写一篇关于此的博客文章并记录我所做的。
    【解决方案2】:

    WCF 服务的一般最佳实践是尽可能采用每次调用的单实例模型。这为您提供了最佳吞吐量、服务实例中最佳和最简单的行为。因此,只要有可能,除非您有真正令人信服的理由,否则请使用此模型。

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

    马克

    【讨论】:

      【解决方案3】:

      如您所述,我通常会即时创建客户端,但请确保在请求完成后将其处理掉。我已经完成了这项工作而没有遇到很多问题,但老实说,我没有 1000 多个用户同时使用完全相同的服务。

      如果您有兴趣,可以在this 博文中找到确切的实现细节。

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

      【讨论】:

      • 是的,ASMX。处置是我最担心的事情。我想我需要做一些重构来清理这一切。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多