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 HttpContext _context;
|
||||||
private FeatureReferences<FeatureInterfaces> _features;
|
private FeatureReferences<FeatureInterfaces> _features;
|
||||||
|
|
||||||
public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features)
|
public DefaultHttpRequest(HttpContext context, IFeatureCollection features)
|
||||||
{
|
{
|
||||||
Initialize(context, features);
|
Initialize(context, features);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http.Internal
|
||||||
private HttpContext _context;
|
private HttpContext _context;
|
||||||
private FeatureReferences<FeatureInterfaces> _features;
|
private FeatureReferences<FeatureInterfaces> _features;
|
||||||
|
|
||||||
public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features)
|
public DefaultHttpResponse(HttpContext context, IFeatureCollection features)
|
||||||
{
|
{
|
||||||
Initialize(context, features);
|
Initialize(context, features);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue