代码之家  ›  专栏  ›  技术社区  ›  TheCodeMonk

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

  •  14
  • TheCodeMonk  · 技术社区  · 17 年前

    我对WCF完全陌生。我很确定它会像普通的web服务一样工作——我也很确定我做得不对,但现在我想确保我做得对。

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

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

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

    所以我把它改为基于会话的。我要么实施错误,要么适得其反,因为它根本不起作用。客户机会超时,导致故障,或者干脆不工作。我现在把它改回缓存,它似乎工作得很好(除了速度慢)。

    3 回复  |  直到 17 年前
        1
  •  6
  •   AnthonyWJones    17 年前

    这类问题通常通过维护一个池来解决。池将容纳一组服务对象,而不是在一个极端中只有一个服务对象,在另一个极端中每个用户有一个服务对象,这些服务对象是支持当前对其服务的需求所必需的。因此,人才库应仅增长到最大需求点。

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

        2
  •  4
  •   marc_s MisterSmith    17 年前

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

    在您的情况下,创建服务实例似乎是一个相当昂贵的操作。也许您需要以某种方式对此进行清理—使实际的服务实例非常精简和轻量级,以便可以在一眨眼(或更少)的时间内创建和处理它,然后拥有一些后台工作进程(或者可能是Anthony建议的一组后台工作进程),然后您可以从实际的服务实例调用这些进程。

    马克

        3
  •  1
  •   Toran Billups    17 年前

    正如您所提到的,我通常会动态创建一个客户端,但请确保在请求完成后处理该客户端。我这样做是为了解决很多问题,但老实说,我没有1000多名用户同时访问完全相同的服务。

    this

    推荐文章