Adding example of what http context pooling might look like
This commit is contained in:
parent
0e3fe7493e
commit
c05c203c28
|
|
@ -0,0 +1,54 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.Http.Features;
|
||||
using Microsoft.AspNet.Http.Internal;
|
||||
|
||||
namespace SampleApp
|
||||
{
|
||||
public class PooledHttpContext : DefaultHttpContext
|
||||
{
|
||||
DefaultHttpRequest _pooledHttpRequest;
|
||||
DefaultHttpResponse _pooledHttpResponse;
|
||||
|
||||
public PooledHttpContext(IFeatureCollection featureCollection) :
|
||||
base(featureCollection)
|
||||
{
|
||||
}
|
||||
|
||||
protected override HttpRequest InitializeHttpRequest()
|
||||
{
|
||||
if (_pooledHttpRequest != null)
|
||||
{
|
||||
_pooledHttpRequest.Initialize(this, Features);
|
||||
return _pooledHttpRequest;
|
||||
}
|
||||
|
||||
return new DefaultHttpRequest(this, Features);
|
||||
}
|
||||
|
||||
protected override void UninitializeHttpRequest(HttpRequest instance)
|
||||
{
|
||||
_pooledHttpRequest = instance as DefaultHttpRequest;
|
||||
_pooledHttpRequest?.Uninitialize();
|
||||
}
|
||||
|
||||
protected override HttpResponse InitializeHttpResponse()
|
||||
{
|
||||
if (_pooledHttpResponse != null)
|
||||
{
|
||||
_pooledHttpResponse.Initialize(this, Features);
|
||||
return _pooledHttpResponse;
|
||||
}
|
||||
|
||||
return new DefaultHttpResponse(this, Features);
|
||||
}
|
||||
|
||||
protected override void UninitializeHttpResponse(HttpResponse instance)
|
||||
{
|
||||
_pooledHttpResponse = instance as DefaultHttpResponse;
|
||||
_pooledHttpResponse?.Uninitialize();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.Http.Features;
|
||||
|
||||
namespace SampleApp
|
||||
{
|
||||
public class PooledHttpContextFactory : IHttpContextFactory
|
||||
{
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly Stack<PooledHttpContext> _pool = new Stack<PooledHttpContext>();
|
||||
|
||||
public PooledHttpContextFactory(IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
}
|
||||
|
||||
public HttpContext Create(IFeatureCollection featureCollection)
|
||||
{
|
||||
PooledHttpContext httpContext = null;
|
||||
lock (_pool)
|
||||
{
|
||||
if (_pool.Count != 0)
|
||||
{
|
||||
httpContext = _pool.Pop();
|
||||
}
|
||||
}
|
||||
|
||||
if (httpContext == null)
|
||||
{
|
||||
httpContext = new PooledHttpContext(featureCollection);
|
||||
}
|
||||
else
|
||||
{
|
||||
httpContext.Initialize(featureCollection);
|
||||
}
|
||||
|
||||
if (_httpContextAccessor != null)
|
||||
{
|
||||
_httpContextAccessor.HttpContext = httpContext;
|
||||
}
|
||||
return httpContext;
|
||||
}
|
||||
|
||||
public void Dispose(HttpContext httpContext)
|
||||
{
|
||||
if (_httpContextAccessor != null)
|
||||
{
|
||||
_httpContextAccessor.HttpContext = null;
|
||||
}
|
||||
|
||||
var pooled = httpContext as PooledHttpContext;
|
||||
if (pooled != null)
|
||||
{
|
||||
pooled.Uninitialize();
|
||||
lock (_pool)
|
||||
{
|
||||
_pool.Push(pooled);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Http.Internal
|
|||
private HttpContext _context;
|
||||
private FeatureReferences<FeatureInterfaces> _features;
|
||||
|
||||
public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features)
|
||||
public DefaultHttpRequest(HttpContext context, IFeatureCollection features)
|
||||
{
|
||||
Initialize(context, features);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http.Internal
|
|||
private HttpContext _context;
|
||||
private FeatureReferences<FeatureInterfaces> _features;
|
||||
|
||||
public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features)
|
||||
public DefaultHttpResponse(HttpContext context, IFeatureCollection features)
|
||||
{
|
||||
Initialize(context, features);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue