asp.net mvc azure"访问数据存储时出错!"

Dav*_*e K 4 session azure asp.net-mvc-2

我已经开始使用AspProviders代码将会话数据存储在我的表存储中.

我偶尔会收到以下错误:

说明:类型"System.Web.HttpException"引发的异常.INNER_EXCEPTION:访问数据存储时出错!INNER_EXCEPTION:处理此请求时发生错误.INNER_EXCEPTION: ConditionNotMet不满足使用HTTP条件标头指定的条件.RequestId:0c4239cc-41fb-42c5-98c5-7e9cc22096af时间:2010-10-15T04:28:07.0726801Z StackTrace:System.Web.SessionState.SessionStateModule.EndAcquireState(IAsyncResult ar)System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar )INNER_EXCEPTION:\ Azure\AspProviders\TableStorageSessionStateProvider.cs中的Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive(HttpContext context,String id,Object lockId):line 484 System.Web.SessionState.SessionStateModule.GetSessionStateItem()System.Web .SessionState.SessionStateModule.PollLockedSessionCallback(对象状态)INNER_EXCEPTION:Microsoft.WindowsAzure.StorageClient.Tasks.Task1.get_Result() Microsoft.WindowsAzure.StorageClient.Tasks.Task1.ExecuteAndWait()Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry [T](Func`2 impl,RetryPolicy policy)Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive(TableServiceContext svc,SessionRow session,Object lockId)in\Azure\AspProviders\TableStorageSessionStateProvider.cs:线603 Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive(HttpContext的上下文中,串ID,对象lockId)在\天青\ AspProviders\TableStorageSessionStateProvider.cs:线480 INNER_EXCEPTION:System.Data.Services. Client.DataServiceContext.SaveResult.d__1e.MoveNext()

有人碰到这个吗?我发现的唯一有用的信息就是这个,我对此犹豫不决:

如果要绕过验证,可以打开TableStorageSessionStateProvider.cs,找到ReleaseItemExclusive,并修改以下代码:

svc.UpdateObject(会话);

至:

svc.Detach(会话);
svc.AttachTo("Sessions",session,"*");
svc.UpdateObject(会话);

这里开始

谢谢!

所以我决定改变这个:

svc.UpdateObject(会话); svc.SaveChangesWithRetries();

对此:

尝试{svc.UpdateObject(session);

svc.SaveChangesWithRetries();
Run Code Online (Sandbox Code Playgroud)

} catch {svc.Detach(session); svc.AttachTo("Sessions",session,"*"); svc.UpdateObject(会话);

svc.SaveChangesWithRetries();
Run Code Online (Sandbox Code Playgroud)

}

所以,我会看到它是如何工作的......

kni*_*hor 9

我也遇到过这个问题,经过一些调查后,如果你有多个实例并尝试在同一个会话中快速连续调用,这似乎更常发生.(例如,如果你有一个自动完成的盒子,并在每个按键上进行ajax调用)

这是因为当您尝试访问会话数据时,首先Web服务器会取消该会话的锁定.请求完成后,它会释放锁定.使用表服务提供程序,它通过更新表中的字段来更新此锁定状态.我认为发生的是Instance1加载会话行,然后Instance2加载会话行,Instance1保存更新的锁定状态,当Instance2尝试保存锁定状态时,它会收到错误,因为该对象不在同一状态当它加载它时(ETag不再匹配).

这就是为什么您找到的修复程序将停止发生错误的原因,因为通过在AttachTo中指定"*",当Instance2尝试保存锁定时,它将关闭ETag检查(并过度写入Instance1所做的更改).

在我们的情况下,我们更改了提供程序,以便我们可以关闭某些路径的会话(给我们的问题的ajax调用不需要访问会话数据,也不需要加载图像)这可能是一个选项你取决于导致你的问题的原因.

不幸的是,TableStorageSessionStateProvider是示例项目的一部分,因此不是(据我所知,但我会高兴地被告知)微软正式支持.它确实有其他问题,比如它在会话到期后不会清理它的会话数据这一事实,所以你最终会遇到会话表和blob容器中的大量垃圾,你必须清理其他一些办法.