HttpContext.Current.Session является нулевым в промежуточном программном обеспечении после next.invoke - PullRequest
0 голосов
/ 20 февраля 2020

Итак, я написал часть промежуточного программного обеспечения для запуска с использованием. 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);
    }
}

' ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...