我有一個ASP.NET 4 Web服務。
它在ModuleController
控制器中有一個ImportModule
動作。ASP.NET HttpContext緩存在插入後立即刪除
這就是它是如何工作的:
- 用戶上傳模塊作爲CSV文件。
- 此文件正在使用
HttpPostedFileBase.InputStream
和自定義CSV閱讀課程閱讀。 - 根據一些規則和驗證,將此文件轉換爲C#對象。如果文件有效,那麼它將轉換爲C#對象,將其存儲在具有唯一GUID名稱的緩存中,並將用戶重定向到
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();
}
在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
的reason
被「刪除」,這意味着它沒有過期,IIS沒有它刪除,由於優化,但它看起來像我去掉就是我自己。 我很肯定,我甚至沒有訪問此緩存記錄之前CompleteImportModule
。
我試圖把new 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池回收?我如何確保文件不被刪除?或者我怎樣才能以另一種方式有效地存儲這些數據?
這是在生產環境還是通過VS進行調試? – heymega
@heymega這是VS開發人員的機器上調試。 –