Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα ομάδα!

Μαθαίνω web development με asp.net εδώ και κάποιο καιρό, ακολουθώ ένα βιβλίο και είμαι στο κεφάλαιο του AJAX, και πιο συγκεκριμένα κόλλησα στα WCF Services, και πως να δημιουργήσω ένα.

 

Ακολουθώντας το tutorial...

 

 

1) Αρχικά πρόσθεσα στο project το Service1.svc, στο οποίο προσέθεσα μια απλή μέθοδο:

using System.ServiceModel;
using System.ServiceModel.Activation;

namespace Ασκηση
{
    [ServiceContract(Namespace = "Niaou")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
        // To create an operation that returns XML,
        //     add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
        //     and include the following line in the operation body:
        //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
        [OperationContract]
        public string DoWork(string a)
        {
            string b = string.Format("Hello {0}!",a);
            return b;
        }

        // Add more operations here and mark them with [OperationContract]
    }
}

υπ' όψιν ότι το βιβλίο δε λέει να πειράξω καθόλου το Namespace εντός του ServiceContract attribute. Αλλά μετά έψαξα και βρήκα το tutorial στο msdn στο οποίο παρατήρησα ότι προσέθεσαν το namespace στο οποίο ανήκει και η ίδια η κλάση, και δοκίμασα και αυτό. Πάλι πρόβλημα Ύστερα βρήκα άλλο tutorial που ο τύπος έβαζε τελείως άλλο όνομα, και είπα να δοκιμάσω το "Niaou". Πάλι το πρόβλημα παραμένει.

 

2) Προσέθεσα το service στο ScriptManager, ώστε να το γνωρίζει.

    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/Service1.svc" />
        </Services>
    </asp:ScriptManager>

3) Προσέθεσα <script> </script> με το κώδικα που μου λέει το βιβλίο:

Service1.DoWork('Imar', helloWorldCallback);
function helloWorldCallback(result)
{
    alert(result);
}

Υ.Γ. Το βιβλίο αναφέρει απλά <script> </script>. Στο msdn tutorial μου λέει να προσθέσω και το attribute: language="javascript", το οποίο όταν το έγραψα έλαβα μήνυμα απ' το VS πως η 'language' δεν υπάρχει σαν attribute στην html5.

Υ.Γ.2. Το βιβλίο λέει πως θα πρέπει το Service1 και η HelloWorld(), να εμφανίζονται στο IntelliSense. Δεν εμφανίζονταν.

 

 

Υποτίθεται πως όταν ανοίξω την σελίδα, θα εμφανιστεί το μήνυμα "Hello Imar!". Δεν εμφανίζεται όμως τίποτα! Πάω στα Developer Tools του Chrome, και ανακαλύπτω το εξής: 

 

Uncaught ReferenceError: Service1 is not defined

 

 

 

Το ίδιο error επιμένει να εμφανίζεται είτε ακολουθώ τα βήματα του βιβλίου, είτε του msdn.

Τι κάνω λάθος ? Γιατί συμβαίνει αυτό ?

Δημοσ.

Από που κι ως πού υπάρχει κάτι που ονομάζεται Service1 για να το χρησιμοποιήσεις στη JS? Αυτό σου λέει και ο browser, δεν ξέρω τι μου λες για Service1.

 

Το τι κάνεις στον server δεν έχει καμία σχέση με τη JS που τρέχει ο client και Service1 δεν πρόκειται να υπάρξει ποτέ εκτός αν κάνεις include κάποιο script που να το ορίζει κάπως. Προφανώς δεν έχεις γράψει εσύ κάτι τέτοιο, άρα πώς; Υποτίθεται πως θα σου κάνει κάτι generate το VS και εσύ αυτό θα το στέλνεις στον client? Σου έχει κάνει generate? Το στέλνεις στον client?

Δημοσ.

Από που κι ως πού υπάρχει κάτι που ονομάζεται Service1 για να το χρησιμοποιήσεις στη JS? Αυτό σου λέει και ο browser, δεν ξέρω τι μου λες για Service1.

 

Το τι κάνεις στον server δεν έχει καμία σχέση με τη JS που τρέχει ο client και Service1 δεν πρόκειται να υπάρξει ποτέ εκτός αν κάνεις include κάποιο script που να το ορίζει κάπως. Προφανώς δεν έχεις γράψει εσύ κάτι τέτοιο, άρα πώς; Υποτίθεται πως θα σου κάνει κάτι generate το VS και εσύ αυτό θα το στέλνεις στον client? Σου έχει κάνει generate? Το στέλνεις στον client?

Υποτίθεται πως αυτή είναι δουλειά του ScriptManager

 

 

 

To register a Web service that you want to call from an AJAX-enabled ASP.NET page, you register the Web service by adding it to the ScriptManager control's Services collection. The Microsoft Ajax framework generates a client proxy object for each ServiceReference object in the Services collection. The proxy classes and their strongly typed members simplify using Web services from client script.

 

Και πως αφού έκανα το service register στον ScriptManager, θα έπρεπε να είχε κάνει generate το σχετικό

proxy object.

 

Φαίνεται πως ο ScriptManager προσθέτει στην τελική html της σελίδας ένα σύνδεσμο στο ServiceName/jsdebug.

Κάνοντας κλικ στο σύνδεσμο στο Chrome για να φανεί ο κώδικάς του, εμφανίζεται άδειο, και error 400.

(Από κάτω φαίνεται το SuperService γιατί για κάθε διαφορετικό tutorial που ακολούθησα έφτιαξα νέο project, με διαφορετικά ονόματα)

 

 

Q9YIinf.png

Δημοσ.

Όταν λες σύνδεσμο εννοείς script tag έτσι; Anyway, αφού δε σου φορτώνει αυτό είναι προφανές ότι εκεί πρέπει να ψάξεις για τη λύση του προβλήματος.

Δημοσ.

 

 

Όταν λες σύνδεσμο εννοείς script tag έτσι; Anyway, αφού δε σου φορτώνει αυτό είναι προφανές ότι εκεί πρέπει να ψάξεις για τη λύση του προβλήματος.

 

Ναι αυτό εννοούσα. Κάνει πολύ auto code generation προσθέτοντας πράγματα πίσω απ' τη κουρτίνα, και η τελική html που καταλήγει στο browser είναι αρκετά διαφορετική. Στο vs βάζω <asp:something>, και απ' αυτό παράγει html και javascript.

 

Λοιπόν άκου να δεις τι έγινε. Φαίνεται πως για το πρόβλημα έφταιγε η τοποθεσία του <script> </script>, σε σχέση με τη τοποθεσία του ScriptManager, και το DOM.

 

Τις προηγούμενες φορές το <script> ήταν εντός του body, και κάτω απ' το ScriptManager. Μεταφέροντας το script στο head όμως, το πρόβλημα λύθηκε. Το μυαλό μου πήγαινε σε 1002 άλλα πράγματα. 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...