3

私は .net の世界は初めてですが、プログラミング歴は 15 年ほどです。現在、クライアント/サーバー ベースのシステム (社内開発) があります。シン クライアントは、ソケット経由でビジネス ロジック プロセス (BLP) に接続します。

クライアントは xml メッセージを BLP に送信し、BLP は同じソケットを介して xml で応答します。

ここまでは順調ですね。BLP は unmanaged c または Ada で記述されています (同じ設計の 2 つのシステムがあります)。

これらの BLP は現在、Web サービスとして公開されています (または、少なくともそれらが提供するいくつかのサービスは公開されています)。

アプリケーション サーバーとして .net/c#/IIS7 を決定しました。

Web サービス要求は IIS に送られ、IIS はそれを c# コードに渡します。さて、これらの BLP のスポーンは非常に重いので、スポーンが 10 接続と言うプールと、aps.net c# コードがプールからの接続を要求し、接続をプールに返すために呼び出すことができるいくつかの関数を作成しました。これは基本的に接続されたソケットです。

私の質問は、IIS でこのプールを静的にする方法ですか? これは「データベース」プールのようなものだと思います。最適には、web.config に接続プールを記述するエントリが必要です。

  • 実装する必要があるインターフェイスはありますか?
  • 見るべきサンプルコードはありますか?
  • それは可能ですか?

私の検索のほとんどは、アプリケーション プールについて説明していますが、これは私が望んでいるものではないと思います。

洞察に満ちたコメントに感謝

編集:

うーん、ポーリングはスレッドセーフなので、最初のオプションを最初に試しました。global.asax と global.asax.cs が既にあったので、次のようなコードを入れます。

public class WebApiApplication : System.Web.HttpApplication
{
    //bnl start
    private  Pool myPool = null;
    public Pool MyPool
    {
        get { return myPool; }
    }
    //bnl stop

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //bnl start
        myPool = new Pool(3, 0, "localhost", 58031, "user", "pwd", "proj");
        myPool.Initialize();
        //bnl stop

    }
}

しかし、コントローラーでは、プールが見えません..

    namespace Resttest.Controllers
    {
        public class ValuesController : ApiController
        {
          // GET api/values
           public IEnumerable<string> Get()
           {  
              // the pool has method getPoolItem to return a free item/connection
              PoolItem pi = Resttest.WebApiApplication.MyPool.getPoolItem();
              return new string[] { "value1", "value2" };
           }

ただし、Resttest.WebApiApplication.MyPool はコントローラーからは見えません。この世界では初心者なので、明らかに間違っていることはありますか?/ビョルン

4

1 に答える 1

2

たとえば、ASP.NETアプリケーションはPHPアプリケーションのようには機能しません。各ASP.NET Webアプリは、要求のライフサイクルに関係なく、中断することなく実行されます。ただし、デフォルトでは20分ごとにリサイクルされます。この値は、アプリケーションプールのパラメーターで変更できます。

アプリケーションの起動時に静的リソースを作成するには、global.asaxと(その姉妹であるglobal.asax.cs)を作成し、コードをApplicationStartイベントに配置します。これらのファイルを自動的に作成するためのVisualStudioテンプレートがあります。

ヒープはリクエスト間で共有されるため、シングルトンも共有されます。ただし、複数のリクエストが並行して実行される可能性があるため、スレッドセーフには特別な注意を払ってください。

もう1つの解決策(そして最も複雑な解決策)は、AutofacのようなIoCコンテナーを使用し、サービスのグローバル実装を登録することです(詳細については、ドキュメントを参照してください。Autofacのセットアップと使用方法は実際にはありません。この回答の範囲)

于 2012-11-08T11:21:51.600 に答える