C# 为iis创建池
我对.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中有一个描述连接池的条目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
- 是否有我应该实现的接口
- 是否有任何示例代码可供查看
- 这可行吗
嗯,投票是线程安全的,所以我先尝试了第一个选项。有一个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örnASP.NET应用程序的工作方式与PHP应用程序的工作方式不同,例如:无论请求的生命周期如何,每个ASP.NET web应用程序都不会中断运行。但是,默认情况下,它每20分钟循环一次。您可以在应用程序池参数中更改此值 要在应用程序启动期间创建静态资源,请创建一个global.asax及其姊妹文件global.asax.cs,并将代码放入
ApplicationStart
事件中。有一个visual studio模板可自动创建这些文件
由于堆是在请求之间共享的,因此也将共享一个单实例。但是,请特别注意线程安全,因为多个请求可以并行运行
另一种解决方案(最好的一种,尽管要复杂得多)是使用IoC容器,并为您的服务注册一个全局实现(有关更多解释,请参阅文档,解释如何设置和使用Autofac并不在本答案的范围内)WMI对执行某些IIS事件有帮助吗?嗯,轮询是线程安全的,所以我先尝试使用frst选项。Autofac不会解决任何线程安全问题。但只要使用它,您就可以从配置(或约定)中管理每个服务的范围您的服务消费者也不必为此烦恼。