为iis创建池

时间:2012-11-08 10:38:09

标签: c# asp.net iis connection-pooling

我是.net的新手,但已经编程了大约15年。 今天,我们有一个基于客户端/服务器的系统(即内部开发)。 瘦客户端通过套接字连接到业务逻辑进程(BLP)。

客户端向BLP发送xml消息,BLP通过xml

的同一套接字进行回复

到目前为止一切顺利。 BLP是用非托管c或Ada编写的(我们有两个系统,相同的设计)

这些BLP现在将作为Web服务发布(或至少它们提供的一些服务)

我们决定.net / c#/ IIS7作为应用服务器。

Web服务请求进入IIS,IIS将其传递给我们的c#代码。 现在,产生这些BLP非常繁重,所以我为他们写了一个池 spawns说10个连接,以及aps.net c#代码可以调用的一些函数 需要池中的连接,并返回到池的连接。 这基本上是一个连接的插座。

我的问题是,如何在IIS中使这个池静态? 我认为它是一种“数据库”池,并且最佳, 我会在web.config中有一个描述连接池的条目。

  • 我应该实现任何接口吗?
  • 是否有任何示例代码可以查看?
  • 可行吗?

我的大多数搜索都描述了应用程序池,我认为这不是我想要的。

感谢富有洞察力的评论

编辑:

嗯,民意调查是线程安全的,所以我先尝试使用第一个选项。有一个global.asax和global.asax.cs alreay,所以我把代码放在

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。 在这个世界上完全是新手,有什么明显的错误吗? /比约恩

1 个答案:

答案 0 :(得分:2)

例如,ASP.NET应用程序不像PHP那样工作:无论请求生命周期如何,每个ASP.NET Web应用程序都可以不间断地运行。然而,它默认每20分钟回收一次。您可以在应用程序池参数中更改此值。

要在应用程序启动期间创建静态资源,请创建global.asax和(其姐妹为global.asax.cs)并将代码放入ApplicationStart事件中。有一个可视化工作室模板来自动创建这些文件。

当请求之间共享堆时,也会共享一个单例。但是,要特别注意线程安全,因为有几个请求可以并行运行。

另一个解决方案(也是最复杂的解决方案)是使用像Autofac这样的IoC容器,并为您的服务注册一个全局实现(有关更多解释,请参阅文档,解释如何设置和使用Autofac并不属于这个答案的范围。)