C# 为iis创建池

C# 为iis创建池,c#,asp.net,iis,connection-pooling,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

我对.net的世界还不熟悉,但已经编程15年了。 今天,我们有一个基于客户机/服务器的系统(即内部开发的)。 瘦客户机通过套接字连接到业务逻辑流程(BLP)

客户机向BLP发送xml消息,BLP使用xml通过同一套接字进行回复

到目前为止还不错。BLP用非托管c或Ada编写(我们有两个系统,设计相同)

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

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

web服务请求进入IIS,IIS将其传递给我们的c#代码。 现在,这些BLP的繁殖非常繁重,所以我为它们写了一个池 生成10个连接,以及一些aps.net c#code可以调用的函数 需要来自池的连接,然后返回到池的连接。 这基本上是一个连接的插座

我的问题是,如何在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" };
           }
namespace restest.Controllers
{
公共类值控制器:ApiController
{
//获取api/值
公共IEnumerable Get()
{  
//池具有方法getPoolItem以返回空闲项/连接
PoolItem pi=restest.WebApiApplication.MyPool.getPoolItem();
返回新字符串[]{“value1”,“value2”};
}
但是,无法从控制器中看到restest.WebApiApplication.MyPool。 作为这个世界上的新手,有什么明显的错误吗?
/Björn

ASP.NET应用程序的工作方式与PHP应用程序的工作方式不同,例如:无论请求的生命周期如何,每个ASP.NET web应用程序都不会中断运行。但是,默认情况下,它每20分钟循环一次。您可以在应用程序池参数中更改此值

要在应用程序启动期间创建静态资源,请创建一个global.asax及其姊妹文件global.asax.cs,并将代码放入
ApplicationStart
事件中。有一个visual studio模板可自动创建这些文件

由于堆是在请求之间共享的,因此也将共享一个单实例。但是,请特别注意线程安全,因为多个请求可以并行运行


另一种解决方案(最好的一种,尽管要复杂得多)是使用IoC容器,并为您的服务注册一个全局实现(有关更多解释,请参阅文档,解释如何设置和使用Autofac并不在本答案的范围内)

WMI对执行某些IIS事件有帮助吗?嗯,轮询是线程安全的,所以我先尝试使用frst选项。Autofac不会解决任何线程安全问题。但只要使用它,您就可以从配置(或约定)中管理每个服务的范围您的服务消费者也不必为此烦恼。