none
Keine Verbindung zu Azure WCF Data Service via Jquery Ajax und GetJSON möglich!

    Frage

  • Hallo Leute, ich belästige Euch nur ungern, und doch stehe ich auf dem Schlauch: warum ist eine Verbindung via AJAX und GETJSON zu einem in AZURE WebSite gespeicherten WCF Data Service (AZURE SQL DB) nicht möglich?

    Freue mich mich auf zhalreiche Tipps und Tricks.

    Greetings Rick

    Mittwoch, 10. Februar 2016 15:33

Antworten

  • Hallo Ulrich,

    das es an JQuery liegt, glaube ich nicht.

    Ich habe mal ein Mini-Beispiel mit der Vorlag "WCF Rest Service" zum Testen erstellt und es auf OneDrive bereitgestellt:
    https://onedrive.live.com/redir?resid=D974FC8F54C88BA9%217496

    Ist ein VS 2010 Projekt, da ich nicht weiß, welche Version Du nutzt; ein Upgrade ist allemal einfacher als ein Downgrade. Die einzigen Anpassungen vom Standard sind eigentlich nur in der Web.Config das Behavior, das JSON geliefert soll, und der EndPoint mit dem Behavior; der Rest ist wirklich nur Standard. Vielleicht gibt das Projekt Dir einen kleinen Anstoß, zum Testen sollte es allemal reichen

    'http://aspwsservices.azurewebsites.net/awdbwebservice.svc/Products(680)';

    Mich wundert, was für ein UriTemplate Du hier verwendet hast, denn ein Parameter 680 in Klammern ist eigentlich nicht nach Rest-Art; siehe A Guide to Designing and Building RESTful Web Services with WCF 3.5

    In meinem Beispiel gibt es 2 Methoden/UriTemplates, da kannst Du den Service mit
    .../awdbwebservice/product=123
    .../awdbwebservice/product/123
    also einmal als Parameter und einmal als URL aufrufen. Steht auch im Programm-Kommentar.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]



    Freitag, 12. Februar 2016 19:20

Alle Antworten

  • Hi Ulrich,
    warum soll das nicht möglich sein? Welches Problem wird angezeigt?

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Mittwoch, 10. Februar 2016 15:38
  • Hi,

    poste bitte die exakte und vollständige Fehlermeldung und den Code, mit dem Du versuchst, auf deinen Service zuzugreifen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 10. Februar 2016 15:43
  • Hi Peter, genau das frage ich mich auch... ich habe mit diversesten Script-Varianten probiert: zuerst $.ajax mit crossdomain=true, mit dataType jsonp...immer eine undefinierte Fehlermeldung!!

    Dann auch mit $.getJSON...immer eine Fehlermeldung 'ungültiges Zeichen' (????)

    Habe auf meiner Web Sites in Azure auch die CORS auf 3 eingestellt usw und so fort inkl. Anpassungen der verschiedenen Endpoints des Services...NIX!

    interessanterweise kann ich aber von meinem Browser einfach die URL des Services angeben und ich kriege ein wunderbares XML-Ergebnis (inkl. ODATA-Filters!)...Vielleicht spannend zu wissen: XMLHttpRequest gibt einen Access denied-Fehler zurück in der Console --> weiter öffnen kann ich aber die Azure-Büchse nicht!

    Freue mich auf Deinen Tipp!

    Vielen herzlichen Dank bereits im Voraus Rick

    Mittwoch, 10. Februar 2016 16:13
  • Hi Stefan, hier einer meiner mittlerweile unzähligen Code-Trials:

    $.getJSON('http://aspwsservices.azurewebsites.net/awdbwebservice.svc/Products',
        function (data) {
            alert(JSON.stringify(data));
                        })
            .done(function () { alert('getJSON request succeeded!'); })
            .fail(function (jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
            .always(function () { alert('getJSON request ended!'); });

    Vielen herzlichen Dank für Deine Hilfe. Grüsse Rick

    Mittwoch, 10. Februar 2016 16:15
  • Hallo Ulrich,

    das Problem kenne ich mit WCF & JavaScript: Per Browser-Aufruf funktioniert es, ebenso mit PHP, nur nicht mit JS.

    Installiere Dir mal den Fiddler2 (kostenlos von http://www.telerik.com/fiddler) und protokolliere mal mit, was der JS Client an den Webservice sendet und zurück erhält. Bei JS und dem Zugriff auf einen anderen Rechner/Domäne sendet JS nicht sofort ein GET/POST, sondern zunächst ein OPTIONS um abzufragen, welche Zugriffe überhaupt zulässt. Der WCF Webservice sendet dann zurück: Kenn ich nicht, kann ich nicht.

    Nun kann man im IIS die Access-Control-Allow-Methods eintragen, nur funktioniert das trotzdem nicht, ich habe es zumindest nicht hinbekommen.

    Was bei mir aber funktioniert ist, das der Webservice selbst diese Information zurückliefert. Dazu muss man in Global.asax folgendes Event implementieren:

    /// <summary>
    /// Globales Event bei Beginn eines Service Requests.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            // Headers zum Vermeiden von CORS Problemen.
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.End();
        }
    }

    Natürlich nur die Methoden eintragen, die unterstützt werden. Mit diesem kleinem bisschen Code funktioniert es bei mir nun einwandfrei ohne Anpassungen am JavaScript Code.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Donnerstag, 11. Februar 2016 06:49
  • Hallo Olaf,

    vielen Dank für Deinen Post. Diese Arbeiten habe ich auch bereits im GLOBAL.asax angepasst und auch in der web.config: NIX, einfach NIX!

    ich habe mittlerweile eine weitere AJAX-Abfrage geschrieben, mit welcher ich im Fiddler als TextView den richtigen Datensatz zurück erhalte...aber: mit einer Fehlermeldung, dass es eben irgendwas 'verbockt'... und so nicht ausgewertet werden kann!!!!!! Grrrrrrrr....

    Hier mein Code:

    $.ajax({
        type: 'GET',
        url: 'http://aspwsservices.azurewebsites.net/awdbwebservice.svc/Products(680)',
        data: {
            field: 'ProductID'
        },
        dataType: 'jsonp',
        contentType: 'application/atom+xml;type=entry;charset=utf-8',
        crossDomain: true,
        }).done(function(response){
            // alert(response);
        }).fail(function(error){
            alert(error.statusText);
        });

    ...und ich habe darum herum bereits sehr viel anderes auch ausgeführt...

    Wenn Du mir einen Tipp geben kannst: ober-genial!!! ;-)

    Grüsse Rick


    ULZ

    Donnerstag, 11. Februar 2016 08:32
  •     dataType: 'jsonp',
        contentType: 'application/atom+xml;type=entry;charset=utf-8',

    Hallo Ulrich,

    dataTyp = jsonp und Content XML; ist das beabsichtigt? Also bei mir sieht ein einfacher Ajax Call so aus:

    ServiceAccess.prototype.getVersion = function (callback) {
                $.ajax({
                    type: "GET",
                    url: baseUrl + "GetVersion",
                    crossDomain: true,
                    success: function (data) {
                        callback(data);
                    },
                    dataType: "json",
                    accepts: "json"
                }).fail(function (err) {
                    console.log(err);
                    alert(err);
                });
            };


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 11. Februar 2016 09:01
  • Hi,

    irgendwie ist da alles falsch. Die Rückgabe sieht teilweise aus wie JSON, der gemeldete Content Type ist aber "application/atom+xml;type=entry;". Wenn man den Service als JSON ansprechen will, kommt ein 400 Fehler, der auf eine Fehlkonfiguration der Anwendung hindeutet.

    Für mögliche Lösungen schau mal hier:

      http://forums.asp.net/t/1916102.aspx?400+Bad+Request+error+when+consuming+WCF+sevice+via+jQuery

    Bzgl. deiner Eigeninterpretation der Fehlermeldungen: Bitte poste immer die genaue und vollständige Fehlermeldung. Eine abgewandelte/umschriebene Variante davon nützt uns leider rein gar nichts.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 11. Februar 2016 09:32
  • Hallo Olaf,  da hast Du recht: auch bei mir sieht so ein einfacher AJAX-Call aus...aber weisst Du: irgendwann mit dem Mute des Verzweifelten ;-)

    Zu Deiner Info: ich verwende die ganz normale jquery-2.2.0.min.js... wie eigentlich auch sonst immer! Und eben: Fiddler ist fähig, das Resultat ganz einfach als Text zurückzubringen...kurz: die erstellte WCF-Struktur ist absolut stimmig!

    Nur für JQuery  und AJAX scheint dies alles egal zu sein: er läuft immer in einen Fehler!

    Hast Du mir eine Empfehlung, wie ich dies Problem mit etwas weniger Neanderthaler-Technologie realisieren kann? Ich brauch jetzt nach 2 Tagen einfach ein brauchbares Ergebnis!

    Vielen Dank und Grüsse Rick


    ULZ

    Donnerstag, 11. Februar 2016 09:39
  • Hallo Stefan, da bin ich Deiner Meinung: ich habe lediglich einen kleinen WCF Data Service erstellt, der "nur" eine kleine Azure SQL DB konsumiert --> diesen Webservice habe ich ebenfalls auf Azure publiziert! Soweit alles ok...

    Interessanterweise kann Fiddler2 den Response hervorragend als TextView darstellen --> mit dem WebService ist also alles i.O.

    Die genaue Fehlermeldung lautet: un unexpected error occurs... mehr kann ich leider auch nicht dazu sagen!

    Hier noch mein AJAX-Code, der mittlerweile in Fiddler2 die TextView-Ergebnisse zeigt:

            $(document).ready(function () {
                var url = 'http://aspwsservices.azurewebsites.net/awdbwebservice.svc/Products(680)';

                    $.ajax({
                        type: "GET",
                        url: url,
                        crossDomain: true,
                        success: getResults,
                        dataType: "jsonp",
                        accepts: "json"
                    }).fail(function (err) {
                        console.log(err);
                        alert("Fehler:" + err);
                    });
            });

    Vielen Dank für Deine Unterstützung! Grüsse Rick


    ULZ

    Donnerstag, 11. Februar 2016 09:47
  •  

    In Deinem AJAX Code steht jetzt ja auch die URL drin und wenn ich die Hauptseite aufrufe, bekomme ich die Meldung, das sie nicht erreichbar ist: The requested URL could not be retrieved.

    Kann es sein, das Du einen Vertipper in der URL hast?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Donnerstag, 11. Februar 2016 10:40
  • Hallo Olaf, habe die ganze Geschichte mal vom Azure geschmissen und neu aufgebaut --> gleiche Problematik!

    Die neue URL lautet:

    http://dietlenbergerservicehost.azurewebsites.net/awdbwebservice.svc/Products(680)

    Vielen Dank für Deine Hilfe! Grüsse Rick


    ULZ

    Donnerstag, 11. Februar 2016 10:42
  • Hallo Ulrich,

    poste bitte mal deine web.config, die global.asax.cs (oder vb) und die komplette Methodendeklaration für GetProducts.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 11. Februar 2016 10:58
  • Die Hauptseite kann man aufrufen, nur der Service Aufruf im Browser liefert


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 11. Februar 2016 11:35
  • Hallo Olaf,

    ich habe mich mittlerweile von Azure-Umgebung verabschiedet für weitere Tests und führe diese nun lokal aus...mit eigentlich gleichem Ergebnis: mit JQuery AJAX und GETJSON keine Ergebnisse mit absoluten Standard-Scripts!!

    Hier das Ergebnis im Fiddler2:

    GET /RESTService.svc/json/680?callback=jQuery22007715684350114316_1455291458409&_=1455291458410 HTTP/1.1
    Host: localhost:56787
    Connection: keep-alive
    Accept: */*
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36
    Referer: http://localhost:49789/JSONPExample.html
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
    Cookie: ASP.NET_SessionId=satjn04g1owtvqc52dfptp31

    Der JSON_String  wird im Fiddler2 absolut korrekt ausgeführt und zurückgeliefert...

    Ich bin ehrlich gesagt langsam am Verzweifeln...

    Grüsse Rick


    ULZ

    Freitag, 12. Februar 2016 15:44
  • Hallo Olaf, ich habe nun den Schwachpunkt gefunden: Zeile 366 im jquery-2.2.0.js wirft einen unbekannten Fehler!

    Gut zu wissen, dass ich nicht der einzige unfähige Programmierer bin...

    In dem Falle arbeiten wir noch ein paar weitere Nächte durch um solche intellektuellen Minderwertigkeiten auszubügeln...Grrrrrr!!!

    Euch, Olaf und Stefan, ganz, ganz herzlichen Dank für die Unterstützung die ich hier erfahren durfte!

    Liebe Grüsse Rick


    ULZ

    Freitag, 12. Februar 2016 16:32
  • Hallo Ulrich,

    das es an JQuery liegt, glaube ich nicht.

    Ich habe mal ein Mini-Beispiel mit der Vorlag "WCF Rest Service" zum Testen erstellt und es auf OneDrive bereitgestellt:
    https://onedrive.live.com/redir?resid=D974FC8F54C88BA9%217496

    Ist ein VS 2010 Projekt, da ich nicht weiß, welche Version Du nutzt; ein Upgrade ist allemal einfacher als ein Downgrade. Die einzigen Anpassungen vom Standard sind eigentlich nur in der Web.Config das Behavior, das JSON geliefert soll, und der EndPoint mit dem Behavior; der Rest ist wirklich nur Standard. Vielleicht gibt das Projekt Dir einen kleinen Anstoß, zum Testen sollte es allemal reichen

    'http://aspwsservices.azurewebsites.net/awdbwebservice.svc/Products(680)';

    Mich wundert, was für ein UriTemplate Du hier verwendet hast, denn ein Parameter 680 in Klammern ist eigentlich nicht nach Rest-Art; siehe A Guide to Designing and Building RESTful Web Services with WCF 3.5

    In meinem Beispiel gibt es 2 Methoden/UriTemplates, da kannst Du den Service mit
    .../awdbwebservice/product=123
    .../awdbwebservice/product/123
    also einmal als Parameter und einmal als URL aufrufen. Steht auch im Programm-Kommentar.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]



    Freitag, 12. Februar 2016 19:20