Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Асинхронный CallWebService

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы специалистов по адаптации системы
Предыдущая тема :: Следующая тема  
Автор Сообщение
Алексей В. Бастриков



Зарегистрирован: 02.06.2008
Сообщения: 118
Откуда: ООО "Инфопроект", г. Екатеринбург

СообщениеДобавлено: Чт 29 Июл 2010 10:40    Заголовок сообщения: Асинхронный CallWebService Ответить с цитатой

Можно ли запустить CallWebService (InMetaUtils.InMetaXmlUtils) асинхронно?
Есть страница asmx, которая достаточно долго выполняется, и поэтому CallWebService грузит клиента.
У объекта Microsoft.XMLHTTP есть возможность асинхронного выполнения. А можно ли данным объектом заменить CallWebService?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пн 02 Авг 2010 08:50    Заголовок сообщения: Ответить с цитатой

Вот исходный код функции CallWebService:
Код:
Public Function XmlCallWebService( _
  ByVal URL As String, _
  ByVal Namespace As String, _
  ByVal Action As String, _
  ByVal Request As Variant) As DOMDocument
' -------------------------
 
  Dim anXmlHttp As XMLHTTP
  Dim aSoapResponseDoc As DOMDocument
  Dim aSoapRequestXml As String, aSoapRequestDoc As DOMDocument
 
  If IsArray(Request) Or IsObject(Request) Then
    Dim aRequestDoc As DOMDocument
    Set aRequestDoc = New DOMDocument
    aRequestDoc.async = False
    aRequestDoc.Load Request
    aSoapRequestXml = aRequestDoc.documentElement.xml
  Else
    aSoapRequestXml = Request
  End If
 
  aSoapRequestXml = _
    "<soap:Envelope " & _
      "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " & _
      "xmlns:xsd='http://www.w3.org/2001/XMLSchema' " & _
      "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" & _
      "<soap:Body>" & _
        "<" & Action & " xmlns='" & Namespace & "'>" & _
          aSoapRequestXml & _
        "</" & Action & ">" & _
      "</soap:Body>" & _
    "</soap:Envelope>"

  Dim aSoapQualifiedAction As String
  aSoapQualifiedAction = Namespace
  If Right(aSoapQualifiedAction, 1) <> "/" Then
    aSoapQualifiedAction = aSoapQualifiedAction & "/"
  End If
  aSoapQualifiedAction = aSoapQualifiedAction & Action
 
  Set anXmlHttp = New XMLHTTP
  anXmlHttp.open "POST", URL & ".asmx", False
  anXmlHttp.setRequestHeader "SOAPAction", aSoapQualifiedAction
  anXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
  anXmlHttp.send aSoapRequestXml
 
  If Not anXmlHttp.responseXML Is Nothing Then
    Set aSoapResponseDoc = anXmlHttp.responseXML
    If Not aSoapResponseDoc.documentElement Is Nothing Then
      Dim aResultNode As IXMLDOMNode
      Set aResultNode = aSoapResponseDoc.selectSingleNode("soap:Envelope/soap:Body/soap:Fault")
      If Not aResultNode Is Nothing Then
        Dim anErrorText As String
        anErrorText = FormatWebServiceError(XmlGetSubNodeText(aResultNode, "faultstring"))
        Err.Raise vbObjectError, URL & ".asmx/" & Action, anErrorText
      Else
        Set aResultNode = aSoapResponseDoc.selectSingleNode("soap:Envelope/soap:Body/" & Action & "Response")
      End If
     
      Dim aResponseDoc As DOMDocument
      Set aResponseDoc = New DOMDocument
      aResponseDoc.async = False
      If Not aResultNode Is Nothing Then
        aResponseDoc.appendChild aResultNode.cloneNode(True)
      End If
      Set XmlCallWebService = aResponseDoc
      Exit Function
    End If
  End If
  Err.Raise vbObjectError, URL & ".asmx/" & Action, anXmlHttp.statusText & vbNewLine & vbNewLine & "----------" & vbNewLine & anXmlHttp.responseText
End Function

Вы можете подправить ее и использовать исправленную версию.

Но не совсем понятно, где Вы собираетесь ее использовать.

Если из методов классов ИнМеты (или из обработчиков событий), то природа этих методов уже синхронна, что делает асинхронный подход маловероятным.

Если же из специализированных asp (aspx), то в них можно использовать готовые сторонние JavaScript SOAP компоненты.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Алексей В. Бастриков



Зарегистрирован: 02.06.2008
Сообщения: 118
Откуда: ООО "Инфопроект", г. Екатеринбург

СообщениеДобавлено: Пн 02 Авг 2010 10:02    Заголовок сообщения: Ответить с цитатой

Спасибо, постараюсь разобраться.
Но вот проблема, использую XmlHTTP, но работает только на localhost-е, если выложить на сервер, статус XmlHTTP становится 500 Sad



ObjectCountService.rar
 Описание:

Скачивание
 Название файла:  ObjectCountService.rar
 Размер файла:  3.28 KB
 Скачено:  1377 раз(а)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Пн 02 Авг 2010 10:46    Заголовок сообщения: Ответить с цитатой

При запросе через localhost допускается использование двух протоколов: SOAP и упрощенный HTTP POST.

В Вашем примере используется упрощенный протокол.

При запросе не через localhost допускается только протокол SOAP.

Чтобы работало любым способом, Вам надо формировать полноценный SOAP-запрос (с конвертами, пространствами имен и пр.).

Если Вы введете в IE URL к ObjectCountService.asmx, то IIS вернет Вам полное описание как упрощенного, так и полного SOAP запроса (там же, кстати, и написано, что упрощенный протокол можно использовать только при обращении через localhost).

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Алексей В. Бастриков



Зарегистрирован: 02.06.2008
Сообщения: 118
Откуда: ООО "Инфопроект", г. Екатеринбург

СообщениеДобавлено: Пн 02 Авг 2010 11:27    Заголовок сообщения: Ответить с цитатой

понял, спс
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы специалистов по адаптации системы Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB