Получение сеанса в веб-сервисе .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

Веб-служба по умолчанию не поддерживает сеанс. Вам нужно явно указать параметр в атрибуте веб-метода

Эти две вещи работают для меня

  • <add name="Session" type="System.Web.SessionState.SessionStateModule"/> под <httpModules>

  • enableSessionState="true" в теге <page>