Итак, я написал часть промежуточного программного обеспечения для запуска с использованием. NET Framework 4.8 для захвата объектов Request и Response и сохранения их в MongoDb.
Все работает как положено, кроме HttpContext Объект .Current.Session имеет значения до запуска следующей строки кода:
await Next.Invoke(context);
Как только он возвращается к моему объекту промежуточного программного обеспечения, объект HttpContext.Current.Session является нулевым. Я испробовал несколько предложений, которые нашел здесь, но ни одно из них не исправило мою проблему.
Оцените все возможные предложения по решению моей проблемы. Я приложу код ниже.
Спасибо, Том
'' '
public class Capture_NetFramework : OwinMiddleware
{
private OwinMiddleware _next;
private readonly RecyclableMemoryStreamManager _recyclableMemoryStreamManager;
private const int ReadChunkBufferLength = 4096;
private Serilog.Core.Logger _logger;
public Capture_NetFramework(OwinMiddleware next) : base(next)
{
_next = next;
_recyclableMemoryStreamManager = new RecyclableMemoryStreamManager();
}
public override async Task Invoke(IOwinContext httpContext)
{
try
{
// Establish the connection to the SeriLog sink for MongoDb
_logger = new LoggerConfiguration()
.WriteTo.MongoDB("mongodb://localhost:27017/Capture", collectionName: "RequestResponseCapture")
.CreateLogger();
// Set the log configuration to the Log.Logger object
Log.Logger = _logger;
//Log Response
await LogResponseAsync(httpContext);
//Log Request
await LogRequestAsync(httpContext);
}
catch (Exception ex)
{
}
finally
{
// Release objects for disposal
if (_logger != null)
{
_logger.Dispose();
}
}
}
private async Task LogRequestAsync(IOwinContext context)
{
string requestBody = string.Empty;
//BrowserDetect(context);
using (var requestStream = _recyclableMemoryStreamManager.GetStream())
{
//await oRequest.Body.CopyToAsync(requestStream);
await HttpContext.Current.Request.InputStream.CopyToAsync(requestStream);
// Sets "requestBody" to the HTML returned in the request body
requestBody = ReadStreamInChunks(requestStream);
// Reset the position back to the beginning
HttpContext.Current.Request.InputStream.Position = 0;
}
// Execute "Build_Request_Model" function to parse the request object
Request request = Build_Request_Model(HttpContext.Current, requestBody);
// Write request information to MongoDb
Log.Information("{@Request}", request);
}
private async Task LogResponseAsync(IOwinContext context)
{
string responseBody;
//to intercept MVC responses, because they don't go through OWIN
HttpResponse httpResponse = HttpContext.Current.Response;
OutputCaptureStream outputCapture = new OutputCaptureStream(httpResponse.Filter);
httpResponse.Filter = outputCapture;
IOwinResponse owinResponse = context.Response;
//buffer the response stream in order to intercept downstream writes
Stream owinResponseStream = owinResponse.Body;
owinResponse.Body = new MemoryStream();
await Next.Invoke(context);
if (outputCapture.CapturedData.Length == 0)
{
//response is formed by OWIN
//make sure the response we buffered is flushed to the client
owinResponse.Body.Position = 0;
await owinResponse.Body.CopyToAsync(owinResponseStream);
//LogResponse(owinResponseStream);
responseBody = ReadStreamInChunks(owinResponseStream);
}
else
{
//response by MVC
//write captured data to response body as if it was written by OWIN
outputCapture.CapturedData.Position = 0;
outputCapture.CapturedData.CopyTo(owinResponse.Body);
//LogResponse(owinResponse);
responseBody = ReadStreamInChunks(owinResponse.Body);
}
//Execute "Build_Response_JSON" function to parse the response object
Response response = Build_Response_Model(HttpContext.Current, responseBody);
// Write request information to MongoDb
Log.Information("{@Response}", response);
}
}
' ''