C# MVC 5控制器中的IndexAutoFrangeException和NullReferenceException
对于我正在进行的项目,我们使用一个名为“MediaDepot”的控制器。此控制器处理服务器上文件(如图像)的所有请求 数据模型检查用户是否可以通过会话对象访问该文件。控制器将会话作为只读字典获取 下面是我们的控制器示例:C# MVC 5控制器中的IndexAutoFrangeException和NullReferenceException,c#,asp.net-mvc,C#,Asp.net Mvc,对于我正在进行的项目,我们使用一个名为“MediaDepot”的控制器。此控制器处理服务器上文件(如图像)的所有请求 数据模型检查用户是否可以通过会话对象访问该文件。控制器将会话作为只读字典获取 下面是我们的控制器示例: [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] public class MediaDepotController : AsyncController { [OutputCach
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MediaDepotController : AsyncController
{
[OutputCache(Location = System.Web.UI.OutputCacheLocation.Client, Duration = 10, VaryByParam = "Hash;Width;Height;ImageID")]
public ActionResult Get(string Hash, int Width, int Height, int ImageID)
{
ActualRequest aRequest = new ActualRequest(Request, Response as HttpResponseWrapper, ControllerContext, HttpContext, Session);
MediaDepotResult result = MediaDepot.MediaDepot.Instance.GetFilePathOfImageItem(aRequest, Hash, Width, Height, ImageID);
var File = Server.MapPath(result.FilePath);
return base.File(File, result.FileType);
}
在生产服务器上,会话对象有时会拒绝加载,并对来自该会话的客户机的所有请求抛出IndexAutoFrangeException或NullReferenceException
堆栈跟踪
[IndexOutOfRangeException:索引超出了数组的边界。]
System.Collections.ArrayList.Add(对象值)+38
System.Collections.Specialized.NameObjectCollectionBase.BaseAdd(字符串名称,对象值)+98
System.Collections.Specialized.NameObjectCollectionBase.BaseSet(字符串名称、对象值)+43
System.Web.SessionState.SessionStateItemCollection.set_项(字符串名称,对象值)+29
System.Web.SessionState.HttpSessionStateContainer.set_项(字符串名称,对象值)+14
System.Web.HttpSessionStateWrapper.set_项(字符串名称、对象值)+17
System.Web.Mvc.SessionStateTempDataProvider.SaveTempData(ControllerContext ControllerContext,IDictionary2值)+101
System.Web.Mvc.TempDataDictionary.Save(ControllerContext ControllerContext,ITempDataProvider tempDataProvider)+102
System.Web.Mvc.Controller.PossiblySaveTempData()+72
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+69
System.Web.Mvc.Controller.b_u15(IAsyncResult asyncResult,Controller-Controller)+12
System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult asyncResult)+28
System.Web.Mvc.Async.WrappedAsyncResultBase1.End()+54
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)+29
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)+10
System.Web.Mvc.MvcHandler.b_uu5(IAsyncResult asyncResult,ProcessRequestState innerState)+21
System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult asyncResult)+36
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End()+54
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+31
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.EndProcessRequest(IAsyncResult结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+9651516
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+155
我知道这是mvc中会话对象的并发问题,但如何防止呢?有没有更好的解决方案可以在不直接链接到文件的情况下向最终用户提供文件?参考将
位置更改为System.Web.UI.OutputCacheLocation.Server
。这有区别吗?看起来应该是这样的,但可能是客户端的位置
是错误的原因?删除行或更改行不会产生差异,但是我发现了一个似乎有效的解决方法。我将此覆盖添加到控制器:protectedoverride void EndExecute(IAsyncResult asyncResult){try{base.EndExecute(asyncResult);}catch(Exception){}}
必须达到该长度似乎有些奇怪,但如果它起作用,然后冷却:)作为参考,将位置更改为System.Web.UI.OutputCacheLocation.Server
。这有区别吗?看起来应该是这样的,但可能是客户端的位置
是错误的原因?删除行或更改行不会产生差异,但是我发现了一个似乎有效的解决方法。我将此覆盖添加到控制器:protectedoverride void EndExecute(IAsyncResult asyncResult){try{base.EndExecute(asyncResult);}catch(Exception){}}
必须达到该长度似乎有些奇怪,但如果它起作用,然后冷静:)