我是.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。 在这个世界上完全是新手,有什么明显的错误吗? /比约恩
答案 0 :(得分:2)
要在应用程序启动期间创建静态资源,请创建global.asax和(其姐妹为global.asax.cs)并将代码放入ApplicationStart
事件中。有一个可视化工作室模板来自动创建这些文件。
当请求之间共享堆时,也会共享一个单例。但是,要特别注意线程安全,因为有几个请求可以并行运行。
另一个解决方案(也是最复杂的解决方案)是使用像Autofac这样的IoC容器,并为您的服务注册一个全局实现(有关更多解释,请参阅文档,解释如何设置和使用Autofac并不属于这个答案的范围。)