0

1 つのアクションで TCPClient を開始する MVC.Net コントローラーを作成しようとしています。別のアクションで最新の結果を読み取り、最後のアクションで TCPClient を閉じます。しかし、私はこれをどこから始めるべきかわかりません。

TCPClient をクラスのオブジェクトにする必要がありますか?

ここに私が始める必要があると思う方法の説得力のあるコードがありますが、アイデアに頭を包み込むことはできません。助けていただければ幸いです

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

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

    public string readMostRecentPacket()
    {
    }

    public bool StopClient()
    {
    }

}

これを使用すると、AJAXポーリングのメタファーであるときに、1回のアクションでクライアントを作成して閉じると接続が拒否され始めるため、TCP接続の潜在的なDOSを回避しようとしています

4

1 に答える 1

0

これを試みる前に、考慮すべき点がいくつかあります。

  1. ASP.NET MVC コントローラーはステートレスです。つまり、リクエストごとにコントローラーの新しいインスタンスが作成され、状態を追跡できなくなります。各コントローラー アクションは、同じ関数内であっても、以前のコントローラー アクションについて何も知りません。これは、HTTP がステートレスであるためです。SessionState、Singleton、アプリケーション キャッシュ、データベースなどを使用して状態を追跡できますが、ASP.NET MVC は追跡しません。
  2. 複数のユーザーが同じコントローラー コード (同じ Web ページ) を呼び出すことになり、コードの複数のインスタンスが実行されることになります。これにより、コードに追跡が困難なバグが発生する可能性があります。別の言い方をすれば、同じコードを呼び出す複数のスレッドが深刻な問題を引き起こす可能性があるということです。
  3. アプローチの実装に成功した場合、ネットワーク接続の作成にはコストがかかるため、おそらく何らかの接続またはクライアント プーリングを実行する必要があります。

考えられるアプローチの 1 つを次に示します (このアプローチをテストまたは実装していないため、注意してください)。

  1. 静的な TCPCient オブジェクトのリストまたは配列を持つ静的クラスを作成します
  2. このクラスへのすべてのアクセスは同期またはロックされています (セマフォ、モニター、またはミューテックスをお読みください)

この静的クラスはアプリケーション内の単一のインスタンスになり、複数のスレッド/ユーザーが互いに踏み込まないようにする必要があります。TCPClient を要求し、ユーザーのセッションでそれを追跡する必要があります。このようにして、後続のすべてのリクエストで TCPClient オブジェクトを検索し、必要なアクションを実行できます。

落とし穴:

  1. マルチスレッド
  2. ブロッキング - Web ページをロードするユーザーが多すぎると、TCPClient 配列/リストが十分に大きくない可能性があります。
  3. デッドロック
  4. メモリ不足エラー
  5. 等。

お役に立てれば。幸運を。

于 2013-04-14T05:48:12.683 に答える