В методе 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.
-------------------------
В чем может быть причина? Пожалуйста, дайте мне знать
Спасибо, Саббир