我正在尝试为每个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方法返回的视图?
答案 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()),这将干扰上述解决方案。