为IIS创建池。

3
我是一个新手,对.net的世界还不熟悉,但我已经编程约15年了。 今天,我们有一个基于客户端/服务器的系统(即内部开发)。 一个轻客户端通过套接字连接到业务逻辑进程(BLP)。
客户端发送xml消息到BLP,后者通过相同的套接字回复xml。
到目前为止都很好。BLP是用未管理的c或Ada编写的(我们有两个系统,设计相同)
这些BLP现在要作为Web服务发布(或至少提供一些服务)
我们已经决定使用.net / c#/ IIS7作为应用程序服务器。
Web服务请求进入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。 作为完全的新手,在这个世界里,有什么明显的错误吗? / Björn


WMI对于执行某些IIS事件是否有帮助? - CuccoChaser
1个回答

2
一种 ASP.NET 应用程序与 PHP 应用程序不同,每个 ASP.NET 网络应用程序都会在请求生命周期内无间断运行。但是默认情况下,它每 20 分钟会被回收一次。您可以在应用程序池参数中更改此值。
要在应用程序启动期间创建静态资源,请创建一个 global.asax 文件(及其姊妹文件 global.asax.cs),并将代码放入 ApplicationStart 事件中。Visual Studio 提供了一个模板来自动生成这些文件。
由于堆在请求之间共享,因此单例也会被共享。但是,请特别注意线程安全性,因为多个请求可以并行运行。
另一种解决方案(也是最好的解决方案,尽管更加复杂)是使用像 Autofac 这样的 IoC 容器,并为您的服务注册全局实现(有关更多说明,请参见文档,本答案的范围并不包括如何设置和使用 Autofac)。

嗯,该投票是线程安全的,因此我首先尝试了第一个选项。 - bnl
Autofac不会解决任何线程安全问题。但是一旦使用它,您将能够从配置(或约定)管理每个服务的范围,您的服务消费者就不必再担心这个问题了。 - Eilistraee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接