我正在运行IIS 7集成模式,我正在使用
在此上下文中不提供请求
当我尝试在调用的Log4Net相关函数中访问它时Application_Start
.这是我的代码行
if (HttpContext.Current != null && HttpContext.Current.Request != null)
Run Code Online (Sandbox Code Playgroud)
并且正在抛出异常以进行第二次比较.
除了检查HttpContext.Current.Request for null之外,我还能检查什么?
在iis7.5上运行mnc时,在此上下文异常中发布了类似的问题 @Request不可用
但也没有相关的答案.
我有以下测试WebAPI代码,我没有在生产中使用WebAPI但我之所以这样做是因为我对这个问题进行了讨论:WebAPI异步问题
无论如何,这是违规的WebAPI方法:
public async Task<string> Get(int id)
{
var x = HttpContext.Current;
if (x == null)
{
// not thrown
throw new ArgumentException("HttpContext.Current is null");
}
await Task.Run(() => { Task.Delay(500); id = 3; });
x = HttpContext.Current;
if (x == null)
{
// thrown
throw new ArgumentException("HttpContext.Current is null");
}
return "value";
}
Run Code Online (Sandbox Code Playgroud)
我曾经相信第二个异常是预期的,因为当await
完成时,它可能会在一个不同的线程上,HttpContext.Current
因为线程静态变量将不再解析为适当的值.现在,基于同步上下文,实际上它可能会在等待之后被强制返回到同一个线程但我在测试中没有做任何奇特的事情.这只是一个简单,天真的用法await
.
在另一个问题的评论中,我被告知HttpContext.Current
在等待之后应该解决.对这个问题甚至还有另一个评论,表明同样的问题.什么是真的?应该解决吗?我想不,但我想要一个权威的答案,因为async
它await
是新的,我找不到任何确定的东西.
TL; DR:HttpContext.Current
可能null
在一个await
?
我正在玩一点.NET的异步功能,并提出了一个我无法解释的情况.在同步ASP.NET MVC控制器中执行以下代码时
var t = Task.Factory.StartNew(()=>{
var ctx = System.Web.HttpContext.Current;
//ctx == null here
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
t.Wait();
Run Code Online (Sandbox Code Playgroud)
ctx
是null
委托范围内.根据我的理解,当您使用TaskScheduler.FromCurrentSynchronizationContext()
任务调度程序时,应该恢复上下文.那么为什么不在这里呢?(我可以,顺便说一下,看到委托在同一个线程上同步执行).
此外,从msdn,a TaskScheduler.FromCurrentSynchronizationContext()
应该表现如下:
排队到返回的调度程序的所有Task实例将通过在该上下文上调用Post方法来执行.
但是,当我使用此代码时:
var wh = new AutoResetEvent(false);
SynchronizationContext.Current.Post(s=> {
var ctx = System.Web.HttpContext.Current;
//ctx is set here
wh.Set();
return;
},null);
wh.WaitOne();
Run Code Online (Sandbox Code Playgroud)
实际上设置了上下文.
我知道这个例子有点做作,但我真的很想了解如何增加我对.NET上异步编程的理解.
需求:
每天在特定时间(例如早上6点)动态地向所有用户发送电子邮件.
到目前为止我做了什么:
我使用Nuget的第三方库Quartz.net.
public class TaskScheduler : IJob
{
public void Execute(IJobExecutionContext context)
{
try {
UserRepository userRepo = new UserRepository();
var users = userRepo.GetUsers();
DashBoardRepository repo = new DashBoardRepository();
foreach (var rec in users)
{
var tasks = repo.GetIncompleteTasks(rec.UserID);
var appointments = repo.GetUpcomingAppointments(rec.UserID);
if (tasks.Count > 0 || appointments.Count > 0)
{
dynamic email = new Email("TaskEmail");
email.To = rec.Email;
email.From = "no-reply@xyz.com";
email.Subject = "Pending items in XYZ";
email.Tasks = tasks;
email.Appointments = appointments;
email.Send();
}
} …
Run Code Online (Sandbox Code Playgroud) 我今天遇到了一个奇怪的问题,对我来说毫无意义.以下是摘要:
在方法内部,我检查一个缓存的项目如下:
private async Task<RatesStatus> getRatesStatusAsync() {
//...
if (_currentHttpContext != null) {
//Here, I am checking for a Cached item
var cachedRatesStatusObj = HttpContext.Current.Cache[Constants.RATESSTATUS_CACHE_KEY_NAME];
if (cachedRatesStatusObj != null)
return (RatesStatus)cachedRatesStatusObj;
}
//...
cacheRatesStatusObject(ratesStatus);
//...
}
Run Code Online (Sandbox Code Playgroud)
这里,HttpContext.Current
ASP.NET应用程序中的预期值不是预期的.然后,在cacheRatesStatusObject
方法内部,我检查是否HttpContext.Current
为null,如下所示:
private void cacheRatesStatusObject(RatesStatus ratesStatus) {
//...
//Seeing if HttpContext.Current is null or not first.
//and it is null here...
if (HttpContext.Current == null)
return;
//...
}
Run Code Online (Sandbox Code Playgroud)
它在那里是空的.不知道这里发生了什么.有什么想法吗?
我正在使用TPL在我的代码中创建新任务.一切都适用于提高性能.但每当有像context.currentuser.iDentifier这样的HTTPContext对象时.此代码抛出一个异常,说HTTP Context对象不可用.空引用异常.我想知道如何将上下文对象传递给任务对象?
asp.net ×4
.net ×2
asp.net-mvc ×1
async-await ×1
asynchronous ×1
c# ×1
caching ×1
httpcontext ×1
iis-7 ×1
postal ×1
quartz.net ×1
system.web ×1