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

现在,如果我将这个列表设置为静态,会发生什么?

我只需要实现一种机制,该机制将限制每分钟来自单个用户''会话的请求数量。

C#web服务实例

现在,如果我将这个列表设置为静态,会发生什么?

在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
    }
  }