3

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

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

4

1 回答 1

2

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

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

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

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

于 2012-11-08T11:21:51.600 回答