Короче говоря, если вы не используете куки-файлы или поставщика сеансов, у идентификатора сеанса нет возможности передать один экземпляр веб-роли другому. В сообщении, о котором вы упоминаете, говорится, что SessionID НЕ будет одинаковым для всех веб-ролей, если вы не используете файлы cookie или хранилище сеансов.
Проверьте этот предыдущий вопрос о способах обработки хранилища состояний в Azure, например используя Table Storage
machineKey не имеет никакого отношения к сеансам или домену приложения, это ключ, используемый для шифрования, дешифрования, проверки аутентификации и просмотра данных состояния. Чтобы проверить это, откройте SessionIDManager.CreateSessionID с помощью Reflector. Вы увидите, что значение идентификатора - это просто случайное 16-байтовое значение, закодированное в виде строки.
Значение AspCookielessSession уже проверяется SessionIDManager в методе GetSessionID, а не CreateSessionID, поэтому проверка уже завершена до выполнения вашего кода. Так как режимом состояния сеанса по умолчанию является InProc, он предполагает, что отдельные веб-роли не смогут проверить ключ сеанса, поэтому они создают новый.
Фактически, роль может мигрировать на другую физическую машину в любое время, и в этом случае ее состояние будет потеряно. В этом сообщении группы разработчиков SQL Azure описан способ использования SQL Azure для хранения состояния именно по этой причине.
РЕДАКТИРОВАТЬ Наконец-то я получил TableStorageSessionStateProvider для работы в режиме без файлов cookie!
В то время как TableStorageSessionStateProvider поддерживает режим без файлов cookie, переопределяя SessionStateStoreProviderBase.CreateUnititializedItem , он не может правильно обрабатывать пустые сеансы в приватном сеансе SessionStateStoreData (блокировка HttpContext, идентификатор строки, идентификатор строки, выход из bo out object lockId, out действия SessionStateActions, исключение bool) . Решение состоит в том, чтобы вернуть пустой SessionStateStoreData, если в базовом хранилище больших двоичных объектов не найдено данных.
Метод длиной 145 строк, поэтому я не буду его вставлять. Искать следующий кодовый блок
if (actions == SessionStateActions.InitializeItem)
{
// Return an empty SessionStateStoreData
result = new SessionStateStoreData(new SessionStateItemCollection(),
}
Этот блок возвращает пустой объект данных сеанса при создании нового сеанса. К сожалению, пустой объект данных не сохраняется в хранилище BLOB-объектов.
Замените первую строку следующей строкой, чтобы она возвращала пустой объект, если большой двоичный объект пуст:
if (actions == SessionStateActions.InitializeItem || stream.Length==0)
Long Stroy Short Состояние сеанса cookieles работает, пока поставщик поддерживает его. Вам придется решить, оправдывает ли использование состояния без cookie использование примера провайдера. Возможно, vtortola должен проверить Кэширование AppFabric CTP . Он включает в себя готовые ASP.NET-провайдеры, намного быстрее и определенно имеет лучшую поддержку, чем примеры провайдеров. Существует даже пошаговое руководство о том, как настроить с ним состояние сеанса.