Получение сеанса в веб-сервисе .NET ASMX
У меня есть веб-служба ASMX, размещенная рядом с моим веб-приложением ASP.NET. Теперь мне нужно получить сеанс пользователей в Webservice. Чтобы проверить это, я сделал этот простой метод:
[WebMethod(EnableSession = true)]
public string checkSession()
{
return HttpContext.Current.Session["userid"].ToString();
}
Итак, сначала я зашел в свой веб-приложение, а затем в браузере перешел на мою веб-службу и нажал "checkSession" на этой автоматической тестовой странице. Я тестировал это на 3 компьютерах. Все 3 из них отлично работают с webapp (поэтому сеансы создаются и т.д.), А 2 из них возвращают значение Session [ "userid" ] при вызове веб-метода, однако последний компьютер возвращает "Ссылка на объект, не установленную на экземпляр объекта", поскольку Session имеет значение null.
Итак, в чем разница между этими компьютерами и почему мое приложение ASP.NET может получать сеансы на всех компьютерах, но веб-служба не может?
Ответы
Ответ 1
SessionID хранятся как файлы cookie в браузере клиента по умолчанию (Обзор состояния сеанса). Поэтому проверьте, правильно ли создается этот файл cookie на этом проблемном компьютере. Может быть, куки отключены по какой-то причине? В этом случае он не будет отправлять SessionID на сервер, когда вы нажимаете на эту веб-службу.
Ответ 2
Возможно, это слишком поздно, но вы пробовали это:
[WebMethod(EnableSession = true)]
public string checkSession()
{
return HttpContext.Current.Session.SessionID
}
Ответ 3
Можете ли вы проверить, сколько рабочих процессов используется вашим приложением? Вы можете проверить его в настройках пула приложений в IIS.
Если используется более одного рабочего процесса, он вызывается для запуска веб-сада. Если это так, то в сеансе proc не будет полезен, поскольку этот сеанс не используется совместно с рабочими процессами. Посмотрите http://www.west-wind.com/weblog/posts/2005/Apr/20/Why-you-shouldnt-use-InProc-Session-State-in-ASPNET
Ответ 4
У вас отключен сеанс в IIS, это превысит правило .net.
Посмотрите на это http://technet.microsoft.com/en-us/library/cc732964(v=ws.10).aspx - он сообщает вам, как отключить сеанс, но показывает, где проверить настройку.
Спасибо
Фрэн
Ответ 5
По умолчанию веб-сервисы являются и должны быть безстоящими. Однако, если вы должны использовать информацию о сеансе, обязательно используйте интерфейсы маркера IReadOnlySessionState и IRequiresSessionState для доступа, использования или изменения информации о состоянии сеанса в веб-сервисе.
Ответ 6
лучший способ сделать этот подход, прежде чем ваша сессия не будет нулевой, а на другой стороне вы
инициализируйте выбранный сеанс своим значением, а затем, когда и где веб-сервис, работающий с httpcontext.current.session, имеет значение!
веб-службы являются апатридами, и лучший способ - получить значение в веб-службе, а не устанавливать или инициализировать значение сеанса
Ответ 7
Веб-служба по умолчанию не поддерживает сеанс. Вам нужно явно указать параметр в атрибуте веб-метода
Эти две вещи работают для меня