XMLHttpRequest - Problem mit Firefox (async.)

HerrVorragend

Grünschnabel
Hallo,

ich habe ein Problem mit dem XMLHttpRequest-Objekt im Firefox.
Mein Ziel ist es einen Web-Service mit Javascript anzusprechen.
Im ersten Versuch habe ich den Aufruf synchron gemacht. Dies funktioniert im IE und im Firefox gleichermaßen. Versuche ich jedoch den Web-Service asynchron mit einem CallBack aufzurufen läuft mein Code-Schnipsel nur noch im IE einwandfrei.

Das Problem liegt (wahrscheinlich bei mir irgendwo...aber) scheinbar beim Event onreadystatechange. Dort bin ich auf ein paar Ungereimtheiten gestoßen, die ich mir nicht erklären kann:

Punkt 1: Wenn ich den Aufruf im Venkman debugge und ich nach dem send-Aufruf einen Moment warte erscheint wie von Geisterhand das gewünschte Ergebnis. Springe ich jedoch schnell durch die einzelnen Schritte bleibt der responseText leer (responseXML ist null).

Punkt 2: Ich lasse bei jedem onreadystatechange den readyState anzeigen. Im IE erscheint 2x 1, dann eine Pause (der Request wird augenscheinlich durchgeführt) und dann zügig 2, 3 , 4 und das Ergebnis. Im Firefox erscheint direkt auf einander 2x 1, 2, 4 und ein leerer Text (Den readyState von 3 scheint er zu überspringen).

Und hier bin ich mit meinem Latein am Ende... :(
Hier noch mein Javascript-Code (im HTML-Teil ist nur ein Knopf der die Methode doIt()) aufruft, und der Web-Service ist ein einfacher .NET-WebService ohne viel Logik):
Vielleicht weiß jemand Rat.

Gruß Peter.

Code:
function execService(url, xml, callback)
{
	var xmlhttp = null;
	try
	{
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      try
      {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (oc)
      {
        xmlhttp = null;
      }
    }
    
    // Mozilla
    if(!xmlhttp && typeof XMLHttpRequest != "undefined")
      xmlhttp = new XMLHttpRequest();
    
    // Error  
    if (!xmlhttp)
      alert("Kein XMLHttpRequest!");

    var result = null;
    var async = false;
    if (callback)
	  {
		async = true;
		xmlhttp.onreadystatechange = function()
		{
			var state = xmlhttp.readyState;
			alert(state);
			if(state != 4)
			{
				return;
			}
					
			var response = xmlhttp.responseText;
							
			if(callback != null)
			{
				if(response != null)
				{
					callback(response);
				}
				else
				{
					callback();
				}
			}
		}
	}
    //xmlhttp.open("POST", url, callback ? true : false);
    xmlhttp.open("POST", url, async);
	xmlhttp.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
	xmlhttp.setRequestHeader("Host", "localhost");
    xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	xmlhttp.setRequestHeader("Content-Length", xml.length);
	xmlhttp.setRequestHeader("SOAPAction", "\"myWebService/HelloWorld\"");
    xmlhttp.send(xml.toString());
    if (!callback)
    {
		result = xmlhttp.responseText;
	}
    //delete xmlhttp;
    return result;
}

function getCallBack(result)
{
	alert(result);
}

function doIt()
{
	var xml = '';
	xml = '<?xml version="1.0" encoding="utf-8"?>';
	xml += '<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/">';
	xml += '<soap:Body>';
	xml += '<HelloWorld xmlns="myWebService">';
	xml += '<name>Peter</name>';
	xml += '</HelloWorld>';
	xml += '</soap:Body>';
	xml += '</soap:Envelope>';
	
	var url = '/projects/SOAPClientDev/WebService.asmx';
	
	//var response = execService(url, xml);
	//alert(response);
	execService(url, xml, getCallBack);
}
 
Mmmh... bei mir funktioniert das Problemlos(soweit ich das testen kann... den "Webservice" hab ich natürlich bei mir nicht parat... aber es kommt auch so eine normale Antwort)
 

Neue Beiträge

Zurück