2009-07-21 12 views
1

Bon, j'essaie (mal) de passer un appel JSONP de jQuery sur une page de test à un service Web WCF fonctionnant localement, comme un appel inter-domaine. J'ai, à un moment ou un autre, soit obtenu une erreur de 1012 URI refusée, ai obtenu une réponse mais en Xml, ou n'ai eu aucune réponse du tout. Actuellement, la façon dont je l'ai configuré il crache un 1012.Impossible de terminer un appel JSONP de jQuery à WCF

Je n'ai pas écrit ce service web, donc il est tout à fait possible que je manque juste un paramètre de configuration quelque part, mais je suis devenu si frustré avec cela que je pense juste en demandant ici sera plus productif. Merci les gars. Détails ci-dessous.

J'ai un service Web WCF avec la méthode suivante:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public decimal GetOrderStatusJson(int jobId) 

Je suis en train d'appeler cette méthode à partir d'une page de test jQuery, via un appel JSONP inter-domaines.

<script type="text/javascript"> 
    getJsonAjaxObject(
    "http://localhost:3960/ProcessRequests.svc/json/GetOrderStatusJson", 
    { "jobId": 232 }); 


    function getJsonAjaxObject(webServiceUrl, jsonData) { 
     var request = { 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: webServiceUrl, 
      data: jsonData, 
      dataType: "jsonp", 
      success: function(msg) { 
       //success! 
       alert("blah"); 
      }, 
      error: function() { 
       //oh nos 
       alert("bad blah"); 
      } 
     }; 


     $.ajax(request); 
    } 
</script> 

Voici les morceaux du web.config configurer à cet effet:

<services> 
    <service behaviorConfiguration="MWProcessRequestWCF.ProcessRequestsBehavior" 
    name="MWProcessRequestWCF.ProcessRequests"> 
     <endpoint address="json" behaviorConfiguration="AspNetAjaxBehavior" 
     binding="webHttpBinding" contract="MWProcessRequestWCF.IProcessRequests" /> 
     <endpoint address="" binding="wsHttpBinding" contract="MWProcessRequestWCF.IProcessRequests"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="MWProcessRequestWCF.ProcessRequestsBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="AspNetAjaxBehavior"> 
      <enableWebScript/> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

Répondre

4

Afin d'obtenir JSONP de travailler avec jQuery, vous devez spécifier votre rappel comme ceci:

"? Myurl callback =?" (documentation jquery here)

De plus, le service Web devra envelopper sa réponse avec l'appel javascript. Exemple: ServiceName.svc/MethodName jscallback = moncallback

retournerait

moncallback (STRING JSON);

Lorsque j'ai dû implémenter quelque chose comme ça, j'ai écrit un HttpModule qui regarderait les requêtes entrantes pour la clé de la chaîne de requête "jscallback". Si le callback était spécifié dans la chaîne de requête, le HttpModule attacherait un filtre de réponse personnalisé pour "envelopper" le json comme indiqué ci-dessus.

0

[ScriptMethod] est-il pour les services Web ASMX, pas pour WCF.

Questions connexes