如何在不同的操作中初始化和关闭TCPClient MVC.NET c#

时间:2013-04-01 20:19:20

标签: c# asp.net-mvc tcpclient

我尝试创建一个MVC.Net控制器,它将在一个操作中启动TCPClient。在另一个动作中读取最新结果,并在最后一个动作中关闭TCPClient。但我不知道从哪里开始。

TCPClient应该是该类的对象吗?

这里有一些关于我认为我需要开始的一些persudo代码,但是我无法将这个想法包围起来,帮助将不胜感激

public class Foo : Controller
{
    TCPClient myClient = new TCPClient();

    public bool StartClient(string ip, int port)
    {
    }

    public string readMostRecentPacket()
    {
    }

    public bool StopClient()
    {
    }

}

我试图避免潜在的DOS连接,因为在单个操作中创建和关闭客户端开始拒绝连接时使用它是一个AJAX轮询隐喻

1 个答案:

答案 0 :(得分:0)

在尝试此操作之前,您需要考虑以下几点:

  1. ASP.NET MVC控制器是无状态的。这意味着每个请求都将创建一个新的控制器实例,您将无法跟踪任何状态。即使在同一个函数中,每个控制器操作也不知道任何先前的控制器操作。这是因为HTTP是无状态的。您可以使用SessionState或Singleton或应用程序缓存或数据库或其他内容来跟踪状态,但ASP.NET MVC不会为您跟踪事情。
  2. 多个用户最终会调用相同的控制器代码(同一个网页),最终会运行多个代码实例。这可能会导致难以跟踪代码中的错误。另一种说法是多个线程调用相同的代码可能会导致严重的问题。
  3. 如果您最终成功实施了您的方法,您可能希望进行某种连接或客户端池化,因为创建网络连接非常昂贵。
  4. 这是一种可能的方法(请谨慎使用,因为我没有测试或实施此方法):

    1. 创建一个静态类,其中包含静态的
    2. TCPCient对象的列表或数组
    3. 同步或锁定对此课程的所有访问权限(请阅读 - 信号量,监视器或互斥锁)
    4. 此静态类将是应用程序中的单个实例,您需要防止多个线程/用户相互踩踏。您需要请求TCPClient并在用户的会话中跟踪它。这样,每个后续请求都可以查找TCPClient对象并采取任何必要的操作。

      缺陷:

      1. 多线程
      2. 阻止 - 当有太多用户加载您的网页时,TCPClient数组/列表可能不够大。
      3. 锁死
      4. 内存不足错误
      5. 希望这会有所帮助。祝你好运。