C#Web服务实例

时间:2014-05-27 06:02:46

标签: c# web-services

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

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

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

2 个答案:

答案 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
    }
  }