Как настроить сеанс Active Record в WCF - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь настроить сеанс в Active Record для каждого запроса WCF. Вот код:

[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 и поэтому он конвертируется в представление, которое запускает отложенную загрузку после того, как он выходит из блока использования, который я предполагаю. Вот ошибка:

Initializing [xxx.Business.Schemas.CommonSchemas.Models.Messaging.Message # 6575] - не удалось лениво инициализировать коллекцию ролей: xxx.Business.Schemas.CommonSchemas.Models.Messaging.Message.MessageStatusHistories, без сеанса или сессия была закрыта

В моей конфигурации IsRunningWebApp имеет значение true.

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

Если вам интересно, почему я возвращаю IQueryable из веб-метода WCF, то это потому, что я использую веб-API WCF (http://wcf.codeplex.com/wikipage?title=WCF%20HTTP),, который позволяет запрашивать ваши объекты в строке запроса url с использованием ODATA.

Что я делаю не так? Как создать сеанс, который длится достаточно долго, чтобы лениво загружать модели при преобразовании их в представления по возвращении из веб-методов?

1 Ответ

0 голосов
/ 21 ноября 2011

Я закончил работу над этим, используя это в моем 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);
            }
        }

Примечание: мне также пришлось удалить использование (new SessionScope ()) из веб-метода, который будет мешатьрешение выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...