C#web服务实例
本文关键字:实例 服务 C#web | 更新日期: 2023-09-27 18:05:12
我在Web服务App_Code中有以下类:
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyService : WebService
{
private readonly MyServiceFacade myService;
static MyService()
{
}
public MyService()
{
myService = new MyServiceFacadeImpl();
}
}
现在我有一个关于如何创建此服务实例的问题。例如,让我们有以下类:
public class MyServiceFacadeImpl()
{
private List<DateTime> dts;
public MyServiceFacadeImpl()
{
dts.Add(DateTime.Now);
}
}
现在,15个用户连接到服务器并使用basicauth进行身份验证,会发生什么?
- 将有15个MyServiceFacadeImpl实例,每个dts中有一个DateTime
- 将有一个MyServiceFacadeImpl实例,dt中有15个DateTimes
现在,如果我将这个列表设置为静态,会发生什么?
我只需要实现一种机制,该机制将限制每分钟来自单个用户''会话的请求数量。
现在,如果我将这个列表设置为静态,会发生什么?
在dts 的静态实例中,将有15个MyServiceFacadeImpl实例和15个DateTime
我只需要实施一个机制,限制每分钟来自单个用户''会话的请求。
您可以使用Dictionary <string, DateTime>
,其中字符串存储用户名。它将是静态的,或者您可以将字典存储在Application对象中。如果你想使用应用程序对象来存储用户的状态,那么MSDN的这篇文章《如何:在应用程序状态中保存值》对此进行了解释
上面的方法对于存储您不想丢失的信息是不安全的。如果您希望将信息存储在持久性介质(如数据库(中,即使web服务出现故障。
有几种不同的方法可以解决此问题。最简单的是实现一个singleton模式,其中它有一个内部字典来注册用户的请求次数。
public sealed class UserRequests{
private static readonly UserRequests instance = new UserRequests();
public static UserRequests Instance { get { return instance; } }
static UserRequests() {}
private UserRequests() {}
private Dictionary<Users,List<DateTime>> _userRequestList;
private void AddRequest(User user){
//Add request to internal collection
}
public bool CanUserMakeRequest(User user){
//Call clean up method to remove old requests for this user
// check the requests to see if user has made too many
// if not call AddRequest and return true, else return false
}
}