您好,我正在使用 WCF 创建一个 API。我的问题可以分为两个独立的问题
1)我有很多电话,例如我有与客户、产品、订单、员工有关的电话。
我的问题是所有这些都应该进入一个公共(public)接口(interface)类,例如
public interface IRestService
public class RestService : IRestService
或者我应该为每次通话准备一个,例如
public interface ICustomer
public class Customer : ICustomer
public interface IProducts
public class Products: IProducts
2) 如果您有一个 API,将被数以万计的用户和数千个用户同时访问,您将如何设置,您的 Web 配置设置是什么,例如在限制方面。另外,您将为 InstanceContextMode
或 ConcurrencyMode
设置什么设置。最后,考虑到网站和手机都可以访问 api,它会是哪种类型的绑定(bind)。
最佳答案
为了良好的实践,我会将 API 分解为单独的接口(interface),以便您将来可以选择将它们拆分为单独的实现。您仍然可以只让一个服务类实现所有接口(interface),如下所示:
public class RestService : ICustomer, IProducts, IOrders
但是,听起来好像您可能希望将它们单独实现。
在并发设置方面,问问自己每次调用需要使用哪些资源。如果您的服务类的构造函数可以编写而无需任何冗长的启动,那么请使用 PerCall。如果您需要初始化昂贵的资源,那么我建议使用 InstanceContextMode.Single 和 ConcurrencytMode.Multiple 并确保编写线程安全的代码。例如:在使用任何类属性或其他共享资源之前,请确保对它们进行 lock() 操作。
不过,数据库连接不会被视为“初始化成本较高”,因为 ADO 将为您进行连接池并消除该开销。
正如拉迪斯拉夫提到的,您的限制设置将通过测试来揭示。您想要对您的服务进行压力测试,并使用结果来了解需要多少台机器来为您的预期负载提供服务。然后,您将需要一个专用的负载均衡器来以循环方式路由请求,或者检查每个服务器的运行状况。负载均衡器可以设置为获取“systemhealth.asp”页面并检查结果。如果您返回“OK”,则该计算机将保留在池中,或者如果超时或返回任何其他状态,则可以暂时从池中删除。
您的绑定(bind)需要是 REST 的 WebHTTPBinding。例如,BasicHTTPBinding 适用于 SOAP 接口(interface),不支持 [WebGet]。
如果它不必是 REST 服务,那么您可以通过使用 NetTcpBinding 获得更高的性能。
关于asp.net - WCF 最佳性能设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4767588/