2 Stimmen

Alsasp-Klassiker, der einen Webservice mit SOAP-Anfrage aufruft

Ich versuche, eine Antwort von einem ASP.NET-Webservice zu erhalten, ohne die GET-Parameter zu verwenden. Ich habe den folgenden Code.

strBarcode = "ABC123"
strURL ="http://serverName/BarcodeGenerator.asmx"
Set xmlReq = Server.CreateObject("Msxml2.DOMDocument.3.0")
Set xmlResp = Server.CreateObject("Msxml2.DOMDocument.3.0")
Set httpReq = Server.CreateObject("MSXML2.ServerXMLHTTP") 

xmlReq.async = false
strXML = CStr(CreateRequest(strBarcode))

xmlReq.loadXML(CStr(strXML))

//Öffnen, asynchron

httpReq.open "POST", CStr(strURL), true 

httpReq.setRequestHeader "Host", "serverName"
httpReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
httpReq.setRequestHeader "SOAPAction", "http://tempuri.org/GetBarcode"

httpReq.send(xmlReq)

strDone = "0"
bTimeout = false
dStart = Now()
dEnd = Now()
lCounter = 0
lCounterPrev = -1   
intStatus = 0
Do while intStatus <> 4 and (Not bTimeout)
   dEnd = Now()
   lCounter = DateDiff("s",dStart,dEnd)

   if lCounter > 30 then bTimeout = True       
   %>. <%      
   'Warte eine Sekunde
   httpReq.waitForResponse 1000
   intStatus = httpReq.readyState
Loop

If httpReq.readyState = 4 Then
    bTimeout = false
    Set xmlResp = httpReq.responseXML
    %>
    Status: <%=httpReq.statusText%>
    Response: <%=httpReq.responseText%> 
    <%
    Set nodes = xmlResp.getElementsByTagName("GetBarcodeResult")
    If (nodes is nothing) THen
    %>Nodes is NULL<%
    Else
    %>Anzahl der Knoten: <%=nodes.length%><%
    End IF
    Set node = nodes(0)
    url = node.nodeValue
End If

Der Status lautet:

Status: Bad Request

und die Antwort lautet:

Response: Bad Request (Ungültiger Hostname)

Was mache ich falsch?

1voto

C. Ross Punkte 29783

Dieser Artikel (jetzt über web.archive.org für die Nachwelt) erklärt es am besten, aber im Grunde genommen konnte der Server aufgrund der IIS-Konfiguration sich selbst nicht finden (der Classic-ASP und der Webservice wurden auf demselben Server gehostet). Es gibt keine Probleme mit dem Code.

0 Stimmen

Dies ist keine Antwort, Sie sollten diese zusätzlichen Informationen Ihrer Frage hinzufügen und diese Antwort löschen.

0 Stimmen

Wie ist dies keine Antwort? ES HAT MEIN PROBLEM GELÖST. Welche anderen Kriterien gibt es für eine Antwort?

0 Stimmen

Ich wollte genau das, was du gepostet hast, zusätzliche Informationen darüber, was ich tun sollte (und nicht tun sollte).

1voto

AnthonyWJones Punkte 182582

Ihr Code versucht, den Host-Header selbst zu setzen. Dies sollten Sie nicht tun.

ServerXMLHTTP übernimmt dies für Sie und zieht den Host-String aus der bereitgestellten URL. Wenn Sie versuchen, dies selbst hinzuzufügen, verfälschen Sie ein wichtiges Kriterium für das HTTP-Protokoll. Host ist der wichtigste Header im 1.1-Protokoll, er ist der einzige Header, der in einer 1.1-Anfrage vorhanden sein muss.

Ich bin mir nicht sicher, warum Sie eine asynchrone Anfrage und WaitForResponse verwenden, nur um ein Time-out zu erkennen. Warum nicht die setTimeouts-Methode und eine synchrone Anfrage verwenden?

0 Stimmen

Vielen Dank für die Host-Notiz. Was die asynchrone Funktion betrifft, behalte ich lediglich die bestehende Funktionalität bei, die das Anzeigen einer Fortschrittsleiste solange ermöglicht, wie sie nicht geladen ist.

0 Stimmen

Fair genug, aber sei gewarnt, async WinHTTP in ASP kann in meiner Erfahrung etwas fragil sein.

0 Stimmen

Das ist fair. Ich finde, dass ASP in IIS 6 im Allgemeinen instabil sein kann. Vielen Dank für die großartigen Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X