2012-06-28 4 views
1

fond:jsonp appelant WCF erreur retour

j'avais créé un service WCF (.NET 3.5) qui a été très bien fonctionner, une exigence est de consommer le service avec JavaScript et, en raison des restrictions de domaine croisées (La le service est sur un serveur différent de celui de la page Web qui contient le javascript), le post-test standard ne fonctionnait pas. J'ai changé de configuration, ajouté un attribut WebInvoke à la méthode selon un article de blog de Microsoft, et obtenu que le service fonctionne avec GET, et confirmé que la méthode fonctionnait en testant avec soapUI. J'essayais de mettre en place un exemple sur JSFiddle, mais comme il s'agit d'un service intranet, je ne pouvais évidemment pas le faire fonctionner.

est la méthode Ici, dans mon fichier SVC.cs: (je l'ai fait quelques changements de code et les modifications apportées au fichier de configuration tout en essayant de comprendre cela)

// On the interface that defines the contract 
    [OperationContract] 
    [WebGet] 
    string Post(string questionid, string answervalue); 

    // In my actual service file code behine. 
    public string Post(string questionid, string answervalue) 
    { 

     Guid dataid = _dataProvider.Post(questionid, answervalue); 
     _dataProvider.Log(retval.ToString()); 
     return dataid.ToString(); 
    } 

maintenant si je tape juste l'URL, j'obtiens une représentation de chaîne du GUID en arrière qui représente cette valeur.

http://localhost/WebPostSvc.svc/json/Post?questionid=207&answervalue=207009 
    returns: "<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">04bb6445-b1af-4214-8f8b-cf66bb15467f</string>" 

Voici le javascript que je suis en train de se rendre au travail:

<script type="text/javascript"> 

    // string functions to allow formatted output 
    String.prototype.format = function() { 
     var args = arguments; 
     return this.replace(/{(\d+)}/g, function(match, number) { 
     return typeof args[number] != 'undefined' 
      ? args[number] 
      : match 
     ; 
     }); 
    }; 

    $(function() 
    { 

     $('.testpostbtn').click(function() { 
      $.jsonp({ 
       url: "ttp://localhost/WebPostSvc.svc/json/Post?questionid=207&answervalue=207009", 
       callbackParameter: "callback", 
       "success" : function(data) { 
        alert(data); 

       }, 
       "error" : function(d, msg) { 
         alert(
          "Could not post the data\ncallback={0}\ncallbackParameter={1}\nurl={2}\n{3}\n" 
           .format(d.callback, d.callbackParameter, d.url, msg) 
         ); 
        } 
      }); 
      alert('request sent!'); 

     }); 
    }); 


</script> 

La méthode .jsonp $ est de:

// jquery.jsonp 2.3.1 (c)2012 Julian Aubourg | MIT License 
// https://github.com/jaubourg/jquery-jsonp 

Tout ce que je dois travailler avec est le erreur retournée par la méthode, que j'ai envoyé à une boîte d'alerte:

Could not post the data 
callback=_jqjsp 
callbackParameter=callback 
url=http://localhost/WebPostSvc.svc/json/Post?questionid=207&answervalue=207009 
error 

Le seul message d'erreur renvoyé est "error", ce qui n'est pas très utile.

Je suis certain que je suis juste en utilisant la méthode de manière incorrecte, et je dois savoir:

Qu'est-ce que je fais mal?

Répondre

0

1) Pour activer le fonctionnement de crossdomain avec WCF, vous devez probablement configurer vos liaisons.

Un exemple I copié de http://bendewey.wordpress.com/2009/11/24/using-jsonp-with-wcf-and-jquery/ contient l'attribut crossDomainAccessEnabled.

<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="webHttpBehavior"> 
     <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <bindings> 
    <webHttpBinding> 
     <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 
    </webHttpBinding> 
    </bindings> 
    <services> 
    <service name="ServiceSite.CustomersService"> 
     <endpoint address="" binding="webHttpBinding" 
       bindingConfiguration="webHttpBindingWithJsonP" 
       contract="ServiceSite.CustomersService" 
       behaviorConfiguration="webHttpBehavior"/> 
    </service> 
    </services> 
</system.serviceModel> 

2) Utilisez les outils de débogage disponibles. Chrome a de bons outils de développement intégrés et dans Firefox vous pouvez installer firebug. Ces deux outils peuvent capturer la demande de réseau et vous donner quelques informations.

Généralement, si la requête n'est jamais déclenchée et que vous obtenez toujours une erreur, l'appel de la fonction présente un problème, si la requête échoue, quelque chose sur le serveur bloque. Habituellement, vous pouvez regarder la réponse et obtenir plus d'informations. Si la réponse est correcte, mais qu'elle échoue, quelque chose ne va pas avec le format de données.