实现我自己的会话状态提供程序是否一个坏主意,该提供程序根据redis会话提供程序和inproc会话提供程序之间的密钥有条件地进行切换?
我正在使用当前使用inproc会话提供程序的非常大的遗留asp.net应用程序.我们正在迁移到Redis作为会话状态提供程序,以便它继续部署,但是应用程序充满了会话滥用(例如,太大的对象,不可序列化的对象,我出于某种原因在那里看到了一个线程?).
我们计划慢慢纠正这些滥用行为,但在纠正之前我们无法真正转向redis.我希望我们可以慢慢地开始将可序列化安全密钥迁移到redis中,而滥用仍然存在于内存中,直到我们解决它们为止.
有没有人对此有任何建议?或者也许是从流程中迁移到流程外的其他建议?
谢谢!
我有一个数据访问层,一个服务层和一个表示层.表示层是ASP.NET MVC2 RTM(Web),服务层是WCF(服务).这都是.NET 3.5 SP1.
问题是在服务中,返回的对象用[DataContract]属性标记.Web正在使用AppFabric Cache(aka Velocity)SessionStateProvider来存储会话状态.因此,我在会话中存储的任何内容都必须是可序列化的.
问题就出现了:DataContracts没有标记,[Serializable]并且据我所知,通过将它引入已经标记出[DataContract]某些问题的类,因此我不相信这是一个解决方案.
我最初计划在Web层使用DataContracts,将它们用作与渲染DataContracts相关的视图的模型(可能嵌套在更高级别的ViewModel类中).但是由于会话状态提供程序要求存储在其中的所有对象都是可序列化的,所以我开始重新考虑这种策略.尽管如此,它会很好,因为它们包含使用IDataErrorInfo接口的验证逻辑,并且相同的验证逻辑可以作为模型绑定的一部分在MVC中重用.
您认为什么是让我减少所需工作的最佳方式?
我目前想到了以下不同的方式:
A.在Web项目中创建"ServiceIntegration"部分.
这将是我的控制器和我的WCF服务层之间的中间人.ServiceIntegration部分将使用DataContracts与服务层对话,使用ViewModels与Web层对话,但必须使用双向Transformer在DataContracts和ViewModel之间进行转换.
此外,由于IDataErrorInfo验证不可重复使用,因此有必要为每个DataContract创建一个Validator,它使用Transformer从ViewModel转换为DataContract,使用IDataErrorInfo执行验证并返回其结果.然后将在控制器的动作方法中使用(例如if (!MyValidator.IsValid(viewModel)) return View();)
需要不同的类:xDataContract,xViewModel,xTransformer,xValidator
B.在Web项目中创建"SessionIntegration"部分
这将是控制器(或访问会话的任何内容)和会话本身之间的中间人.任何需要访问会话的内容都将通过此课程.DataContracts将在整个应用程序中使用,除非它们存储在会话中.SessionIntegration部分负责将DataContract转换为某种ISerializable形式,然后返回.由于在DataContract上使用了IDataErrorInfo接口,因此无需额外的Validator.
需要不同的类:xDataContract,xTransformer,xSerializableForm
注意:在两种情况下仍然会有ViewModels,但是(B)我可以从DataContracts组成ViewModels.
(B)具有不需要额外验证器的好处.
在我完全实现(A)/(B)之前,我想要一些反馈.目前,我开始倾向于(B),但是,(A)可能更灵活.无论哪种方式,对于它的价值而言似乎太过分了.有没有其他人遇到过这个问题,你是否同意/不同意我,和/或你有其他办法解决这个问题吗?
谢谢,
詹姆士
asp.net-mvc session datacontract iserializable session-state-provider
我正在使用RedisSessionStateProvider这样的程序https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-session-state-caching/
我定义了它的连接字符串web.config,在这个例子中是XXXXXX.
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.5" />
<globalization culture="es-CO" uiCulture="es" />
<customErrors mode="Off" />
<sessionState mode="Custom" customProvider="SessionStateStore">
<providers>
<add name="SessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="XXXXXX" throwOnError="true" applicationName="NominappSession" />
</providers>
</sessionState>
</system.web>
Run Code Online (Sandbox Code Playgroud)
我不想把连接字符串放在源代码中.那么我如何使用Azure中的设置来定义此连接字符串?
我从github部署到azure,所以它使用Kudu.我没有外部CI服务器.
有什么建议吗?
azure session-state-provider azure-web-sites stackexchange.redis azure-web-app-service
我正在为我的 ASP.NET MVC 应用程序实现自定义会话状态提供程序。我的要求是我必须将会话数据存储xml在 Sql 服务器中的自定义表中。
我可以使用现有的sql 会话状态提供程序(覆盖某些方法)还是我必须通过实现抽象类从头开始创建SessionStateStoreProviderBase?