Состояние сеанса потеряно после запроса HttpWebRequest в записи AJAX - PullRequest
3 голосов
/ 21 декабря 2011

У меня немного странное поведение в asp.net веб-приложении, которое приводит к потере состояния сеанса.

Процесс

Пользователь входит в приложение, и сеанс установлен. Затем они заполняют 1 поле, и приложение затем выполняет веб-службу AJAX POST .asmx. В веб-службе я использую HttpWebRequest для получения данных с другого сервера.

Эти данные затем выводятся в браузер.

Затем заполняются еще несколько полей, а затем данные снова Post в тот же веб-сервис через AJAX POST.

Задача

Сразу после HttpWebRequest я получаю имя пользователя из переменной сеанса. Это работает. Однако при следующем запросе AJAX сеанс больше не существует.

Во время тестирования я удалил этап, на котором вызывается HttpWebRequest, и мой сеанс никогда не теряется. Поэтому по какой-то причине сеанс удаляется ПОСЛЕ моего первого AJAX POST и до второго AJAX POST, только если я запускаю код HttpWebRequest.

Код

Я не делаю ничего необычного в коде. Просто делаю простую JQuery AJAX Post

$. Ajax ({ URL: метод, данные: параметры, тип: "POST", contentType: "application / json; charset = utf-8", dataType: "json", success: function (data) { // обрабатывать данные }, error: function (xhr, status, error) {} });

Создание System.Net.HttpWebRequest и затем получение System.Net.HttpWebResponse из этого.

Затем чтение переменной сеанса dim username as string = Session(_SESSION_USERNAME).ToString()

Я никогда раньше не замечал такого поведения при использовании HttpWebRequest (хотя AJAX не использовался)

Function Backfill(value As String) As Details

    Dim details As Details = Nothing
    Dim appSettings As ConfigSettings.AppConfig = ConfigSettings.AppConfig.getConfig()

    Dim url As String = appSettings.Settings.BackfillUrl
    Dim username As String = appSettings.Settings.BackfillUser
    Dim password As String = appSettings.Settings.BackfillPass

    Dim expParameters As String = ""
    Dim xml As XmlDocument = Nothing
    Dim xmlHttp As XMLHTTP = Nothing
    Dim nodeList As XmlNodeList = Nothing
    Dim node As XmlNode = Nothing
    Dim response As String = ""
    Dim success As String = ""

    '
    ' REMOVED TO HIDE INFO
    expParameters = "<PARAMETERS>" & _            
        "</PARAMETERS>"

    Try

        xmlHttp = New XMLHTTP()
        xmlHttp.open("POST", url)
        xmlHttp.Send(expParameters)

        response = xmlHttp.responseText()

        xml = New XmlDocument
        xml.LoadXml(response)
        SaveExperianFile(xml, value)
        nodeList = xml.DocumentElement.ChildNodes
        node = nodeList.Item(0)
        success = node.Attributes.GetNamedItem("success").Value.ToString.Trim
        If success.ToLower.Trim = "y" Then
            details = SetDetails(xml)
        End If

    Catch ex As Exception
    Finally
        If Not xmlHttp Is Nothing Then
            xmlHttp.Dispose()
            xmlHttp = Nothing
        End If
    End Try

    Return details

End Function

редактировать

Код класса XMLHTTP можно увидеть здесь http://codepaste.net/ymnqsf

редактировать

Кажется, что-то странное происходит, когда я сохраняю XMLDocument в моей файловой системе.

Private Sub SaveExperianFile(xml As XmlDocument, value As String)
    Dim appConfig As ConfigSettings.AppConfig = ConfigSettings.AppConfig.getConfig()
    Try
        xml.Save(HttpContext.Current.Server.MapPath(appConfig.Settings.SavePath & value & "_backfill.xml"))
    Catch ex As Exception

    End Try
End Sub

Если я не вызываю этот метод, тогда сеанс всегда установлен.

Вопрос

Знаете ли вы, что вызывает такое поведение?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Можете ли вы проверить, если вы просто потеряете сеанс или все приложение будет перезапущено.Если вы сохраняете XML-файл в папке виртуального каталога / веб-приложения, может потребоваться перезагрузка веб-приложения.Если бы множество дюжин файлов были добавлены друг за другом, это был бы случай перезапустить пул приложений.

0 голосов
/ 21 декабря 2011

просто предчувствие, но, возможно, вам нужно поддерживать файлы cookie через HttpWebRequests.

посмотрите на этот вопрос для получения дополнительной помощи.

Http-веб-запрос не поддерживает сеанс

...