2010-11-15 3 views
1

Update1:comment appeler cross domaine WebService/WCF dans JQuery

voici ce que je reçois quand je copier et coller l'URL du service dans le navigateur IE:

http: // myservername /myservices.svc?wsdl

- <wsdl:message name="ILodge_GetCountfor"> 
    <wsdl:part name="parameters" element="tns:GetCountfor" /> 
    </wsdl:message> 
- <wsdl:message name="ILodge_GetCountfore"> 
    <wsdl:part name="parameters" element="tns:GetCountfor" /> 
    </wsdl:message> 
- <wsdl:message name="ILodge_GetCountfor_Input"> 
    <wsdl:part name="parameters" element="tns:GetCountfor" /> 
    </wsdl:message> 
- <wsdl:message name="ILodge_GetCountfor"> 
    <wsdl:part name="parameters" element="tns:GetCountfor" /> 
    </wsdl:message> 

http: //myservername/myservices.svc xsd = xsd0

- <xs:element name="GetCountfor"> 
- <xs:complexType> 
- <xs:sequence> 
    <xs:element minOccurs="0" name="GetCountforResult" type="xs:long" /> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
- <xs:element name="GetCountfor"> 
- <xs:complexType> 
- <xs:sequence> 
    <xs:element minOccurs="0" name="Id" nillable="true" type="xs:string" /> 
    <xs:element minOccurs="0" name="LevelId" type="xs:long" /> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
- <xs:element name="GetCountfor"> 
- <xs:complexType> 
- <xs:sequence> 
    <xs:element minOccurs="0" name="GetCountfor" type="xs:long" /> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

MISE À JOUR:

je vois les services me retourner en XML:

public override string ToString() 
    {    
     //- <name>CLUE</name><desc>CLUE list</desc> 
     StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); 
     sb.AppendLine("<kml xmlns=\"someSITE">"); 
     sb.AppendLine("<FOLDER>"); 
     sb.AppendLine("<name>Clue</name>"); 
     sb.AppendLine("<desc>Clue list</desc>"); 
     sb.AppendLine("</FOLDER>"); 
     sb.AppendLine("</kml>"); 
     return sb.ToString(); 
    } 

j'ai essayé autre façon d'exécuter la référence ci-dessous inter-domaine, mais sans succès ... ce je fais mal ici? i essayer le débogage et le point de rupture, mais mis a l'air comme jamais exécuter

$(document).ready(function() { 

$.getJSON("http://servername/tools/myservice.svc/mymethod/?Id=1&callback=?", null,   
     function (result) { 
     alert("in test: " + result); 
     debugger 
     $("#spText").html(result); 
    }); 

OR 

     var path = "http://servername/tools/myservice.svc/mymethod?Id=1&callback=?"; 
      $.ajax({ 
       type: "GET", 
       url: path, 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       async: false, 
       success: function (response) { 
        debugger 
        if (response != null) { 
         //displayData(response); 
        } 
       } 
      }); 

OR 
      debugger 
      $.ajax({ url: "http://servername/tools/myservice.svc/mymethod", 
       data: { Id: "1" }, 
       dataType: "jsonp", 
       success: function (json, textStatus) { 
        alert(json.d); 
        alert(textStatus); 
       }, 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 
        debugger 
       } 
      }); 


    OR 
      $.ajax({ 
       type: "GET", 
       cache: false, 
       url: "http://servername/tools/myservice.svc/mymethod/Id=1&callback=?", 
           scriptCharset: "utf-8", 
           dataType: "jsonp", 
           data: parameters, 
           success: function (data, textStatus) { 
            debugger 
           }, 
           error: function (XMLHttpRequest, textStatus, errorThrown) { 
            debugger 
           } 
          }); 
} 
+0

duplication possible de [accès refusé avec jquery-1.4.1.js] (http://stackoverflow.com/questions/4146650/access-is-denied-using-jquery-1-4-1-js) – lonesomeday

+0

Veuillez modifier les questions existantes plutôt que d'en poster de nouvelles si elles correspondent au même problème. – lonesomeday

+0

Je ne reçois pas d'erreur d'accès refusé dans la question affichée. –

Répondre

0

Je suppose que la « réponse » n'est pas valide jsonp. Copiez l'URL dans la barre d'adresse de votre navigateur et montrez-nous ce que vous verrez.

Voici un exemple comment jsonp ressemble:

someFunction({'foo':'some foo','bar':'some bar'}) 

Un exemple en direct de flickr: http://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=08e4f6fc4216b1216c5f521133ecbd9b&jsoncallback=functionName

Il ressemble à l'appel d'une fonction avec un argument comme objet littéral. Cela ressemble à cela, car ce sera plus tard un appel de fonction. Le fonctionnement de jsonp est: Un élément <script> sera injecté dans le DOM, qui a défini l'URL fournie comme attribut src. Donc la ressource n'est pas une chaîne ou un document XML, c'est un fichier javascript. S'il est incorporé dans le document, il sera exécuté et l'argument est accessible.

Je ne peux pas vous dire la meilleure façon de créer jsonp, cela dépend de l'endroit où vous obtenez les données et ce que vous aimez faire avec (et bien sûr sur l'environnement donné aussi).

+0

J'ai regardé le service et la méthode particulière que j'essaie d'appeler son retour "long" juste quelques numéros –

+0

J'ai mis à jour ma question ... –

+0

Je vois. Vous devez vérifier si le servive est également disponible au format jsonp. Sinon, vous devez créer un type de proxy (sur le serveur) qui récupère la réponse du serveur distant et la transmet au document html. –

0

L'extension normale .Net pour les services WCF est .svc il ressemble à tous vos appels sont à .svs

Je ne pense pas .svs est une extension .net normale de sorte que le temps d'exécution est probablement même pas essayer d'exécuter le côté serveur d'appel.

Modifiez les extensions ou reconfigurez votre serveur Web.

+0

mon erreur c'était typo et j'ai corrigé à svc –

0

pour être honnête je ne sais pas sur asp.net, mais je pense que vous avez manqué d'échapper à cette sb.AppendLine("<kml xmlns=\"someSITE">");, il devrait être comme: sb.AppendLine("<kml xmlns=\"someSITE\">");

vous pouvez le dire à partir de la fonction de rédacteur en chef SO mettant en lumière, Merci SO équipe :)

public override string ToString() 
     {    
      //- <name>CLUE</name><desc>CLUE list</desc> 
      StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); 
      sb.AppendLine("<kml xmlns=\"someSITE\">"); 
      sb.AppendLine("<FOLDER>"); 
      sb.AppendLine("<name>Clue</name>"); 
      sb.AppendLine("<desc>Clue list</desc>"); 
      sb.AppendLine("</FOLDER>"); 
      sb.AppendLine("</kml>"); 
      return sb.ToString(); 
     } 
+0

on dirait que j'ai foiré quand je changeais le nom de site ainsi je ne pense pas que c'est la question pourquoi mon jquery n'exécute pas. –

1

i ont essayé de manière différente d'exécuter la référence de domaine croisé ci-dessous, mais sans succès ...

Les navigateurs n'autorisent pas les requêtes ajax interdomaines en raison des risques de sécurité. Si votre page Web et votre service Web se trouvent sur des domaines différents, vous devrez ajouter une deuxième page, sur le même domaine que votre page Web, pour négocier les demandes.

+0

Je suis en train d'essayer d'accéder aux services de wcf via la page html, donc je n'ai pas de pages web. –

+0

J'utilise la page html et la page web comme synonymes dans ma réponse. Le service wcf est-il sur le même domaine que la page html? – roto

+0

wcf service est sur un serveur différent et j'essaie d'accéder à partir de ma machine de développement local. –

0

L'objet XMLHttpRequest est strictement interdit d'appeler des services Web en dehors du domaine qui a initialement servi la page. Il y a d'énormes raisons de sécurité à cela.

Dans votre cas, le domaine desservant la page est "localhost". Le javascript ne peut pas accéder au webservice distant. Tu ne vas pas contourner ça.

Cela dit, vous avez une option. Vous pouvez avoir votre javascript frappé un service Web LOCAL qui se retourne et appelle le service Web REMOTE et transmet l'information à votre javascript. Pour plus d'informations voir this article on Simple-Talk qui va dans le détail sur plusieurs options possibles à votre disposition.