|
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 Откуда: ООО "Инфопроект", г. Екатеринбург
|
|
Вернуться к началу |
|
|
Михаил Власов
Зарегистрирован: 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 Заголовок сообщения: |
|
|
понял, спс
|
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|