我在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进行身份验证,会发生什么?
现在,如果我将此列表设为静态,会发生什么?
我只需要实现一种机制,该机制将限制每分钟来自单个用户\会话的请求数。
答案 0 :(得分:0)
现在,如果我将此列表设为静态,会发生什么?
在静态dts实例中将有15个MyServiceFacadeImpl实例和15个DateTime
我只需要实现一个限制数量的机制 每分钟来自单个用户\会话的请求。
您可以使用Dictionary <string, DateTime>
字符串存储用户名。它将是静态的,或者您可以在Application对象中存储字典。如果要使用Application对象存储用户状态,则此MSDN文章How to: Save Values in Application State会对其进行说明。
上述方法不能安全存储您不想丢失的信息。如果你想要它,甚至Web服务都会失效,你会考虑在像数据库这样的持久性媒介中存储信息。
答案 1 :(得分:0)
有几种不同的方法可以解决这个问题。 最简单的方法是实现单例模式,其中有一个内部字典,用于将用户注册到用户发出请求的次数。
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
}
}