插入后立即删除ASP.NET HttpContext缓存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了插入后立即删除ASP.NET HttpContext缓存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4780字,纯文字阅读大概需要7分钟。
内容图文
![插入后立即删除ASP.NET HttpContext缓存](/upload/InfoBanner/zyjiaocheng/662/30079032de6e43abbe9e78e9820b5675.jpg)
我有一个ASP.NET 4 Web服务.
它在ModuleController控制器中具有ImportModule操作.
这就是它的工作方式:
>用户将模块上传为CSV文件.
>正在使用HttpPostedFileBase.InputStream和自定义CSV读取类读取此文件.
>根据一些规则和验证,此文件正在转换为C#对象.如果文件有效,则它将转换为C#对象,并以唯一的GUID名称存储在Cache中,并且将用户重定向到CompleteImportModule操作.
>用户检查数据是否正确,并确认上传.
长话短说,有一个代码可以告诉您更多信息:
ImportModule动作.
public ActionResult ImportModule(HttpPostedFileBase file)
{
if (!ModelState.IsValid)
{
return RedirectToAction("Index");
}
ModuleQuestion[] questions;
ModuleInfo moduleInfo;
string uploadId = Guid.NewGuid().ToString();
// It is my custom CSV-reader and it works. Values are assigned
FormDataCsvReader csvReader = new FormDataCsvReader(file.InputStream);
if (!csvReader.Process(out questions, out moduleInfo))
{
// File is invalid
return RedirectToAction("Index");
}
ViewBag.UploadId = uploadId;
ViewBag.ModuleInfo = moduleInfo;
ViewBag.Questions = questions;
HttpContext.Cache.Add("UploadModule_" + uploadId,
new Tuple<ModuleInfo, ModuleQuestion[]>(moduleInfo, questions),
null,
Cache.NoAbsoluteExpiration,
TimeSpan.FromMinutes(30),
CacheItemPriority.NotRemovable,
(k, v, r) =>
{
LoggingFactory.GetLogger().Debug("Removed from cache: {0}. Reason: {1}", k, r);
});
return View();
}
在视图ImportModule中:
// Output data from ViewBag.ModuleInfo and ViewBag.Questions
<form method="POST" action="@Url.Action("CompleteImportModule")">
<input type="hidden" name="uploadId" value="@ViewBag.UploadId"/>
<input type="submit" value="Send">
</form>
CompleteImportModule操作:
[HttpPost]
public ActionResult CompleteImportModule(string uploadId)
{
var item = HttpContext.Cache["UploadModule_" + uploadId];
if (item == null) RedirectToAction("Index");
// upload module
HttpContext.Cache.Remove("UploadModule_" + uploadId);
return RedirectToAction("Index");
}
但是,我遇到了一些问题.我无法上传模块,因为在插入后立即从缓存中删除了该值.它仅存储一秒钟:
DEBUG 2015-06-22 15:00:18,696 thread 85: Added to cache:
UploadModule_c843077d-21d0-4e9f-9e5e-3df82da4bac8
DEBUG 2015-06-22 15:00:19,935 thread 48: Removed from cache:
UploadModule_c843077d-21d0-4e9f-9e5e-3df82da4bac8. Reason: Removed
原因是“已删除”,这意味着它没有过期,并且由于优化,IIS尚未将其删除,但看来我删除的是我本人.
我非常确定我什至在CompleteImportModule之前都不会访问此缓存记录.
我尝试将新的StackTrace().ToString()放入CacheItemRemovedCallback中.就是这样,如果它可以以某种方式帮助您:
at CPMAdministrator.Controllers.ModulesReferenceController.<ImportModule>b__9(String key, Object value, CacheItemRemovedReason reason)
at System.Web.Caching.CacheEntry.CallCacheItemRemovedCallback(CacheItemRemovedCallback callback, CacheItemRemovedReason reason)
at System.Web.Caching.CacheEntry.Close(CacheItemRemovedReason reason)
at System.Web.Caching.CacheSingle.UpdateCache(CacheKey cacheKey, CacheEntry newEntry, Boolean replace, CacheItemRemovedReason removedReason, Object& valueOld)
at System.Web.Caching.CacheSingle.Dispose(Boolean disposing)
at System.Web.Caching.CacheMultiple.Dispose(Boolean disposing)
at System.Web.HttpRuntime.Dispose()
at System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
为什么会这样呢?是IIS池回收吗?如何确保未删除文件?或如何以其他方式有效地存储此数据?
解决方法:
我花了几个小时找到答案,并在发布问题后立即找到了答案!让我与您分享我的经验.
根据我的StackTrace,我了解到缓存已清除,因为该应用程序已结束并被处置:
at System.Web.HttpRuntime.Dispose()
at System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(Object state)
我所需要的只是找到原因.
我已经打开Global.asax文件并添加了Application_End方法.
public class MvcApplication : HttpApplication
{
protected void Application_End()
{
}
}
它是在视图渲染成功之后以及清除缓存之前立即触发的.成功!现在,我需要知道应用程序终止的原因.
This post帮助我:
There’s
System.Web.Hosting.HostingEnvironment.ShutdownReason
property that indicates why the application is being terminated. Its
value can be retrieved from insideApplication_End()
.
我在Application_End的开头添加了一个断点,并添加了要观察的System.Web.Hosting.HostingEnvironment.ShutdownReason.
那就是它存储的内容:BinDirChangeOrDirectoryRename.
之后,我了解到原因是我的log4net正在BinDirectory中写日志.我只是不知道,如果bin目录已更改,IIS将无法完成Web应用程序.
我已将日志移到父文件夹(应用程序本身),现在可以使用了.
看来我需要阅读有关ASP.NET的更多信息.
我希望它会帮助某人.感谢所有尝试提供帮助的人.
内容总结
以上是互联网集市为您收集整理的插入后立即删除ASP.NET HttpContext缓存全部内容,希望文章能够帮你解决插入后立即删除ASP.NET HttpContext缓存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。