[JS] Lezen van response van .net webservice

Pagina: 1
Acties:

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Ik heb een stukje javascript geschreven wat XML files leest door te POSTen of GETten naar een webserver. Heel simpel eigenlijk....

Het werkt zolang ik een kant-en-klaar xml file in de testsite hang en die lees. Krijg ik dezelfde response van de webserver werkt het niet. Geen foutmeldingen te bekennen als ik hem debug in VS, de tekstinhoud van de response ziet er ook goed uit (alleen geen enters er in, terwijl dat blokjes zijn in mijn handmatig gemaakte xml), maar de responseXML blijft leeg.

Dit is het stukje code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    XML.AjaxObject = function(url, params, method, returnFunction)
    {
        var req;
        var returnFunction = returnFunction;
        var params = params;
        var url = url;
        var method = method;
        
        loadXMLDoc();

        function loadXMLDoc() 
        {
            req = false;
            // branch for native XMLHttpRequest object
            if(window.XMLHttpRequest && !(window.ActiveXObject))
            {
                try 
                {
                    req = new XMLHttpRequest();
                } 
                catch(e) 
                {
                    req = false;
                }
                // branch for IE/Windows ActiveX version
            } 
            else if(window.ActiveXObject) 
            {
                try 
                {
                    req = new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch(e) 
                {
                    try 
                    {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                    } 
                    catch(e) 
                    {
                        req = false;
                    }
                }
            }
            if(req) 
            {
                req.onreadystatechange = processReqChange;
                var sendString = "";
                if (method == "GET")
                {
                    var glue = "";
                    for (var i = 0; i < params.count; i++)
                    {
                        sendString += glue + params[i][0] + "=" + params[i][1];
                        glue = "&";
                    }
                    url += "?" + sendString;
                    sendString = "";
                }
                else
                {
                    sendString = params;
                }

                req.open(method, url, true);
                req.setRequestHeader("Content-Type", "text/xml;charset=utf-8"); 
                // This header is a required part of the SOAP protocol 
                req.setRequestHeader("SOAPAction", '"localhost/GetEmployeeWeekInfo"'); 
                req.send(sendString);
            }
        }
        
        function processReqChange() 
        {
            // only if req shows "loaded"
            if (req.readyState == 4) 
            {
                // only if "OK"
                if (req.status == 200 || req.status == 0) 
                {
                    returnFunction(req.responseXML);
                } 
                else 
                {
                    alert("There was a problem retrieving the XML data:\n" +
                        req.statusText);
                }
            }
        }
    }


Dus als ik tijdens het debuggen de letterlijke tekst van de response pak (dus ook zonder de enters), die in een tekstfile.xml plak en in de site plaats en die aanroep werkt het dus wel!

iOS developer


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 20:21

crisp

Devver

Pixelated

Heeft de respons van de server wel de juiste content-type header?

Intentionally left blank


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-12-2025

Bosmonster

*zucht*

En je haalt hem wel op van hetzelfde domein?

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Dit heb ik qua headers:

code:
1
2
3
4
5
6
7
8
X-AspNet-Version    2.0.50727
Date    Fri, 10 Oct 2008 19:57:55 GMT
#status#    HTTP/1.1 200 OK
Content-Length  1128
Connection  Close
Content-Type    application/soap+xml; charset=utf-8
Server  ASP.NET Development Server/9.0.0.0
Cache-Control   private, max-age=0


Heb het naar application/soap+xml veranderd, dat hielp ook niet.
Bosmonster schreef op vrijdag 10 oktober 2008 @ 18:03:
En je haalt hem wel op van hetzelfde domein?
Ja beiden via localhost, andere poort alleen.

iOS developer


Verwijderd

BikkelZ schreef op vrijdag 10 oktober 2008 @ 22:02:
Ja beiden via localhost, andere poort alleen.
Mag niet. XHR mag alleen via
• hetzelfde protocol
• hetzelfde subdomein
• hetzelfde domein
• dezelfde poort

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Ik trek dit uit de debugger:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
-       req {...}   IXMLHTTPRequest
+       [Methods]       
        onreadystatechange  {???}   void
        readyState  4   Long
+       responseBody    {...}   Array of Byte
        responseStream  {...}   Object
        responseText    "<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetEmployeeWeekInfoResponse xmlns="localhost"><GetEmployeeWeekInfoResult><Name>Lucas van Dongen</Name><DefaultWorkHours>40</DefaultWorkHours><Id>1</Id><Days><Day><Date>2008-10-06T22:13:10.0580118+02:00</Date><WorkHours>8</WorkHours></Day><Day><Date>2008-10-07T22:13:10.0580118+02:00</Date><WorkHours>8</WorkHours></Day><Day><Date>2008-10-08T22:13:10.0580118+02:00</Date><WorkHours>8</WorkHours></Day><Day><Date>2008-10-09T22:13:10.0580118+02:00</Date><WorkHours>8</WorkHours></Day><Day><Date>2008-10-10T22:13:10.0580118+02:00</Date><WorkHours>8</WorkHours></Day><Day><Date>2008-10-11T22:13:10.0580118+02:00</Date><WorkHours>0</WorkHours></Day><Day><Date>2008-10-12T22:13:10.0580118+02:00</Date><WorkHours>0</WorkHours></Day></Days><IsTravelDistancePaid>false</IsTravelDistancePaid><IsTravelHoursPaid>false</IsTravelHoursPaid></GetEmployeeWeekInfoResult></GetEmployeeWeekInfoResponse></soap:Body></soap:Envelope>"  String
-       responseXML {...}   IXMLDOMDocument2
+       [Methods]       
+       [Events]        
        async   true    Boolean
        attributes  null    IXMLDOMNamedNodeMap
        baseName    ""  String
+       childNodes  {Count = 0} IXMLDOMNodeList
        dataType    null    Variant
        definition  null    IXMLDOMNode
        doctype null    IXMLDOMDocumentType
        documentElement null    IXMLDOMElement
        firstChild  null    IXMLDOMNode
+       implementation  {...}   IXMLDOMImplementation
        lastChild   null    IXMLDOMNode
+       namespaces  {Count = 0} IXMLDOMSchemaCollection
        namespaceURI    ""  String
        nextSibling null    IXMLDOMNode
        nodeName    "#document" String
        nodeType    9   Long
        nodeTypedValue  null    Variant
        nodeTypeString  "document"  String
        nodeValue   null    Variant
        ontransformnode {???}   void
        ownerDocument   null    IXMLDOMDocument
        parentNode  null    IXMLDOMNode
        parsed  true    Boolean
+       parseError  {...}   IXMLDOMParseError
        prefix  ""  String
        preserveWhiteSpace  false   Boolean
        previousSibling null    IXMLDOMNode
        readyState  4   Long
        resolveExternals    false   Boolean
        schemas null    Variant
        specified   true    Boolean
        text    ""  String
        url ""  String
        validateOnParse false   Boolean
        xml ""  String
        status  200 Long
        statusText  "OK"    String


200, OK, een hele lap tekst terug gekregen en dan toch nog fout gaan omdat het niet via de zelfde poort gaat? Ik ga eens kijken of ik er wat aan kan doen, maar VS start standaard de Webservice op een andere poort op dan de website zelf.

[ Voor 24% gewijzigd door BikkelZ op 10-10-2008 22:18 ]

iOS developer


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 20:21

crisp

Devver

Pixelated

Kijk eens wat responseXML precies bevat. Op de frontpage gebruiken we deze functie met debug-mogelijkheden; misschien heb je er wat aan:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
validateXML: function(requestObject)
{
    var xmlDoc = requestObject.responseXML, documentElement = null;

    if (xmlDoc)
        try { documentElement = xmlDoc.documentElement; } catch(e) {}

    if (!documentElement && requestObject.responseText && window.DOMParser)
    {
        // ugly workaround; try parsing reponseText :P
        var parser = new DOMParser();
        xmlDoc = parser.parseFromString(requestObject.responseText, 'text/xml');
        documentElement = xmlDoc.documentElement;
    }

    if (xmlDoc)
    {
        if (documentElement)
        {
            if (documentElement.tagName == 'parsererror' || documentElement.tagName == 'error')
            {
                if (debug) alert('Error in XML respons:\n' + documentElement.firstChild.nodeValue);
            }
            else
            {
                return xmlDoc;
            }
        }
        else
        {
            if (xmlDoc.parseError)
            {
                if (debug) alert('Error parsing XML respons:\n' + xmlDoc.parseError.reason + '\n' + url);
            }
            else
            {
                if (debug) alert('No valid data in XML respons');
            }
        }
    }
    else
    {
        if (debug) alert('The responseXML object was empty');
    }

    return false;
},

Intentionally left blank


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Tja de parseerror variabele was wel leeg, maar misschien dat ik hem eens moet aanroepen.

iOS developer


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Hij blijft op dit stukje hangen:

JavaScript:
1
2
3
4
if (xmlDoc.parseError) 
                {
                    if (debug) alert('Error parsing XML respons:\n' + xmlDoc.parseError.reason);
                }


Maar vervolgens is mijn alert leeg en in mijn debug venster zie ik ook niets spannends:

code:
1
2
3
4
5
6
7
8
-       xmlDoc.parseError   {...}   IXMLDOMParseError
        errorCode   0   Long
        filepos 0   Long
        line    0   Long
        linepos 0   Long
        reason  ""  String
        srcText ""  String
        url ""  String


Is dit wel echt een error?

----------

Als ik mijn lokaal opgeslagen XML bestand inlees komt hij er wel door......hoe zou het kunnen dat mijn error leeg blijft?

[ Voor 11% gewijzigd door BikkelZ op 13-10-2008 10:01 . Reden: toch wel ]

iOS developer


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-12-2025

Bosmonster

*zucht*

Hetzelfde bestand doet het lokaal wel. Er zijn nu twee mogelijke problemen gegeven waar je iets mee kunt doen:

a. Het bestand wordt verkeerd geserveerd vanuit de server.
b. Je zit met een rechten-issue ivm met het port-verschil

Wat heb je gedaan om deze twee mogelijke problemen te achterhalen cq op te lossen?

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 29-12-2025
Bosmonster schreef op maandag 13 oktober 2008 @ 10:05:
Hetzelfde bestand doet het lokaal wel. Er zijn nu twee mogelijke problemen gegeven waar je iets mee kunt doen:

a. Het bestand wordt verkeerd geserveerd vanuit de server.
b. Je zit met een rechten-issue ivm met het port-verschil

Wat heb je gedaan om deze twee mogelijke problemen te achterhalen cq op te lossen?
Ik heb even ter test een webservice gebouwd (helloworld) in de website. Als ik die aanroep krijg ik "415 unsupported media type", wat inhoudt dat ik de verkeerde request headers meestuur (1:1 overgenomen van mijn voorbeeldje als ik naar die URL navigeer). Kortom, nog minder dan remote? *zucht*

Enigszins beu van het probleem heb ik het volgende gedaan, namelijk de responseText naar een XML documentje geparsed en dat doorgezet naar de rest van de verwerkende functies.

Works.

:X

iOS developer


  • daboemann
  • Registratie: April 2007
  • Laatst online: 30-12-2025
Verwijderd schreef op vrijdag 10 oktober 2008 @ 22:14:
[...]

Mag niet. XHR mag alleen via
• hetzelfde protocol
• hetzelfde subdomein
• hetzelfde domein
• dezelfde poort
Betekend dit dat je XHR niet clientside kunt gebruiken om een lokaal bestand uit te lezen? Want ik had vandaag een probleem met een website die ik voor school moet maken. Het moet een volledige clientside website zijn en die standalone zonder bijvoorbeeld USBwebserver draait. In die website zou ik dan het liefst wel een include willen gebruiken in plaats van een iframe of frames überhaupt.
Misschien dat er nog wel een andere manier is voor clientside includen van lokale pagina's.

Bedankt iig voor t debug scriptje crisp
Pagina: 1