加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用AppFabric缓存在MVC SessionState中使用WCF

发布时间:2020-12-16 07:15:31 所属栏目:asp.Net 来源:网络整理
导读:我有一个数据访问层,一个服务层和一个表示层.表示层是ASP.NET MVC2 RTM(Web),服务层是WCF(服务).这都是.NET 3.5 SP1. 问题是在服务中,返回的对象标有[DataContract]属性. Web正在使用AppFabric Cache(a.k.a Velocity)SessionStateProvider来存储会话状态.因
我有一个数据访问层,一个服务层和一个表示层.表示层是ASP.NET MVC2 RTM(Web),服务层是WCF(服务).这都是.NET 3.5 SP1.

问题是在服务中,返回的对象标有[DataContract]属性. Web正在使用AppFabric Cache(a.k.a 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))返回View();)

需要不同的类:xDataContract,xViewModel,xTransformer,xValidator

B.在Web项目中创建“SessionIntegration”部分

这将是控制器(或访问会话的任何内容)和会话本身之间的中间人.任何需要访问会话的内容都将通过此课程. DataContracts将在整个应用程序中使用,除非它们存储在会话中. SessionIntegration部分负责将DataContract转换为某种ISerializable形式,然后返回.由于在DataContract上使用了IDataErrorInfo接口,因此无需额外的Validator.

需要不同的类:xDataContract,xSerializableForm

注意:在两种情况下仍然会有ViewModels,但是(B)我可以从DataContracts组成ViewModels.

(B)具有不需要额外验证器的好处.

在我完全实现(A)/(B)之前,我想要一些反馈.目前,我开始倾向于(B),但是,(A)可能更灵活.无论哪种方式,对于它的价值而言似乎太过分了.有没有其他人遇到过这个问题,你是否同意/不同意我,和/或你有其他办法解决这个问题吗?

谢谢,

詹姆士

解决方法

如果没有A或B的完整路由,您是否可以创建一个通用的ISerializable包装器对象并将它们放在SessionState中?

[Serializable]
    public class Wrapper : ISerializable
    {
        public object Value { get; set; }

        void ISerializable.GetObjectData(SerializationInfo info,StreamingContext context)
        {
            if (Value != null)
            {
                info.AddValue("IsNull",false);
                if (Value.GetType().GetCustomAttributes(typeof(DataContractAttribute),false).Length == 1)
                {
                    using (var ms = new MemoryStream())
                    {
                        var serializer = new DataContractSerializer(Value.GetType());
                        serializer.WriteObject(ms,Value);
                        info.AddValue("Bytes",ms.ToArray());
                        info.AddValue("IsDataContract",true);
                    }
                }
                else if (Value.GetType().IsSerializable)
                {
                    info.AddValue("Value",Value);
                    info.AddValue("IsDataContract",false);
                }
                info.AddValue("Type",Value.GetType());
            }
            else
            {
                info.AddValue("IsNull",true);
            }
        }

        public Wrapper(SerializationInfo info,StreamingContext context)
        {
            if (!info.GetBoolean("IsNull"))
            {
                var type = info.GetValue("Type",typeof(Type)) as Type;

                if (info.GetBoolean("IsDataContract"))
                {
                    using (var ms = new MemoryStream(info.GetValue("Bytes",typeof(byte[])) as byte[]))
                    {
                        var serializer = new DataContractSerializer(type);
                        Value = serializer.ReadObject(ms);
                    }
                }
                else
                {
                    Value = info.GetValue("Value",type);   
                }
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读