如何在WCF中设置Active Record Session

时间:2011-11-21 15:30:10

标签: wcf nhibernate activerecord

我正在尝试为每个WCF请求在Active Record中设置会话。这是代码:

[WebGet(UriTemplate = "ReadMessages?authUserId={authUserId}&authGuid={authGuid}&userId={userId}&lastMessageId={lastMessageId}&startDate={startDate}&endDate={endDate}")]
        public IQueryable<Message> ReadMessages(int authUserId, string authGuid, uint userId, uint lastMessageId, 
            DateTime startDate, DateTime endDate)
        {
            UserUtility.Authenticate(authUserId, authGuid);

            using (new SessionScope())
            {
                //get messages.
                return from m in MessageData.FindAll(userId, lastMessageId, startDate, endDate)
                    select ConvertToView(m);
            }
        }

即使我有SessionScope使用块,它仍然给我一个延迟加载错误,因为它返回一个IQueryable,所以它转换为一个视图,触发延迟加载,在它超出我正在猜测的使用块之后。这是错误:

初始化[xxx.Business.Schemas.CommonSchemas.Models.Messaging.Message#6575] - 无法懒惰地初始化角色集合:xxx.Business.Schemas.CommonSchemas.Models.Messaging.Message.MessageStatusHistories,无会话或会议已经结束

在我的配置中,我将IsRunningWebApp视为真。

var source = new InPlaceConfigurationSource();
source.IsRunningInWebApp = true;

如果您想知道为什么我从WCF Web方法返回IQueryable,那是因为我正在使用WCF Web API(http://wcf.codeplex.com/wikipage?title=WCF%20HTTP),它允许您使用ODATA在URL查询字符串中查询对象。

我做错了什么?我如何创建一个足够长的会话来延迟加载模型,因为我将它们转换为从Web方法返回的视图?

1 个答案:

答案 0 :(得分:0)

我最终在Global.asax中使用它进行了工作:

public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Items.Add("ar.sessionscope", new SessionScope());
        }

        public void Application_EndRequest(object sender, EventArgs e)
        {
            try
            {
                var scope = HttpContext.Current.Items["ar.sessionscope"] as SessionScope;
                if (scope != null)
                    scope.Dispose();
            }
            catch (Exception ex)
            {
                HttpContext.Current.Trace.Warn("Error", "EndRequest: " + ex.Message, ex);
            }
        }

注意:我还必须从web方法中删除使用(新的SessionScope()),这将干扰上述解决方案。