Странное поведение при доступе к HttpContext.Current.Session - PullRequest
0 голосов
/ 28 апреля 2020

В методе WCF SaveOrder Метод, я вызываю пожар и забываю asyn c метод с именем HandleSaveOrderPostProcessing , я добавил метод в поток пула потоков, я передаю HttpContext. Current & OperationContext.Current в этом методе выглядит следующим образом:

    public ServiceResult SaveOrder(Models.Orderhead order)
    {
     var result = new ServiceResult();
     ........
     ........
        var httpcontext = System.Web.HttpContext.Current;
            var opcontext = System.ServiceModel.OperationContext.Current;

            //Task t = Task.Factory.StartNew(() => HandleSaveOrderPostProcessing(order, result, httpcontext, opcontext));
            Task t = Task.Run(async() => await HandleSaveOrderPostProcessing(order, result, httpcontext, opcontext)).ContinueWith((tsk) =>
            {
                var iexs = tsk.Exception.InnerExceptions;
                StringBuilder exMsg = new StringBuilder(tsk.Exception.Message);
                foreach(var iex in iexs)
                {
                    exMsg.AppendLine(iex.Message);
                }

                return HandleError(order, result, "An unhandled error occurred processing the order.", exMsg.ToString(), ServiceResult.Status.Error);

            }, TaskContinuationOptions.OnlyOnFaulted);

     return result; 
    }

    private async Task HandleSaveOrderPostProcessing(Models.Orderhead order, ServiceResult result, System.Web.HttpContext httpcontext, System.ServiceModel.OperationContext opcontext)
    {
            System.Web.HttpContext.Current = httpcontext;
            System.ServiceModel.OperationContext.Current = opcontext;

            var issCredentialsCached = AuthCache.IsCredentialsCached;//Throwing error sometimes

            .............
            .............
            .............
            var issCredentialsCached = AuthCache.IsCredentialsCached;//working exactly
            .............
            .............
    }

    public class AuthCache
    {
      public static bool IsCredentialsCached
      {
        get
        {
          try
          {
             *bool* isCached1 = (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.Cache != null && HttpContext.Current.Cache.Count > 0 &&
        (HttpContext.Current.Session == null ||
        (
          HttpContext.Current.Session != null && (
          HttpContext.Current.Session[Globals.SessionNameCompanyUser] == null &&
          HttpContext.Current.Session[Globals.SessionNameCompany] == null &&
          HttpContext.Current.Session[Globals.SessionNameUser] == null)
        )));

      return isCached1;
    }
    catch(Exception ex1)
    {
      var builder = new StringBuilder();
      try
      {
        if (HttpContext.Current != null)
        {
          builder.AppendLine("HttpContext.Current is not null.");
        }
        if (HttpContext.Current.User != null)
        {
          builder.AppendLine("HttpContext.Current.User is not null.");
        }
        if (HttpContext.Current.Cache != null)
        {
          builder.AppendLine("HttpContext.Current.Cache is not null.");
        }
        if (HttpContext.Current.Cache.Count > 0)
        {
          builder.AppendLine("HttpContext.Current.Cache is greater than zero.");
        }
        if (HttpContext.Current.Session == null)
        {
          builder.AppendLine("HttpContext.Current.Session is null.");
        }
        if (HttpContext.Current.Session != null)
        {
          builder.AppendLine("HttpContext.Current.Session is not null.");
        }
        if (HttpContext.Current.Session[Globals.SessionNameCompanyUser] == null)
        {
         builder.AppendLine("HttpContext.Current.Session[Globals.SessionNameCompanyUser] is null.");
        }
        if (HttpContext.Current.Session[Globals.SessionNameCompany] == null)
        {
          builder.AppendLine("HttpContext.Current.Session[Globals.SessionNameCompany] is null.");
        }
        if (HttpContext.Current.Session[Globals.SessionNameUser] == null)
        {
          builder.AppendLine("HttpContext.Current.Session[Globals.SessionNameUser] is null.");
        }
      }
      catch (Exception ex2)
      {
        //TODO:Temporary code.Need to remove 
        var path = @"C:\Exception\ExceptionWebService.txt";
       System.IO.Directory.CreateDirectory(@"C:\Exception");
        if (!System.IO.File.Exists(path))
        {
          System.IO.FileStream f = System.IO.File.Create(path);
          f.Close();
        }
        using (System.IO.StreamWriter writer = new System.IO.StreamWriter(path, true))
        {
          writer.WriteLine("-------------------------");
          writer.WriteLine(System.DateTime.Now.ToString());
          writer.WriteLine(builder.ToString());
         writer.WriteLine("-------------------------");
        }
      }
      throw ex1;
    }
        }
    }
    }

Иногда выдает ошибку из 3-го оператора (проверка IsCredentialsCached) в методе HandleSaveOrderPostProcessing, этот же оператор выполняется без ошибок в конце метода. ошибка Ссылка на объект не установлена ​​для экземпляра объекта . Поэтому я добавил блок catch, записал журнал в файл и обнаружил, что всегда код из условия if (HttpContext.Current.Session! = Null) никогда не записывается в журнал.

-------------------------
28-04-2020 11:36:37
HttpContext.Current is not null.
HttpContext.Current.User is not null.
HttpContext.Current.Cache is not null.
HttpContext.Current.Cache is greater than zero.
HttpContext.Current.Session is null.
-------------------------

В чем может быть причина? Пожалуйста, дайте мне знать

Спасибо, Саббир

...